Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Hello world http://www.cyberforum.ru/cpp-beginners/thread938707.html
Здравствуйте при написании hello world возникает такая ошибка: error C2146: syntax error : missing ';' before identifier '_getch' Вот мой код #include "stdafx.h" #include <conio.h> #include...
C++ Пустой конструктор без аргументов Всем доброго времени суток. Я сейчас в процессе изучения С++, читаю книгу Лафоре "Объектно-ориентированное программирование в С++". На странице 242 имеется код, в котором используется пустой... http://www.cyberforum.ru/cpp-beginners/thread938702.html
Как используя закрытое наследование использовать 2 объекта базового класса? C++
Доброго времени суток. Учусь по книге "Прата С. Язык программирования C++. Лекции и упражнения. Не могу понять упражнение...(глава 14, упр 2) Выполните еще раз упражнение 1, но вместо включения...
разделения файла на части C++
Нужно написать программу для разделения файла на части. Вы указываете вашей программе файл, который нужно разделить, количество частей, на который нужно разделить файл, и ваша программа из одного...
C++ Подготовка к решению сложных задач и задач олимп.уровня http://www.cyberforum.ru/cpp-beginners/thread938603.html
Собственно, интересует какую литературу стоит почитать, для решению сложных и интересных задач или может быть есть какие- нибудь известные в узком кругу форумы на эту тему
C++ Запись элемента строки в char Никак не получается записать элемент строки в переменную char. #include <iostream> #include <conio.h> #include <cstdlib> #include <math.h> #include <fstream> #include <sstream> подробнее

Показать сообщение отдельно
Убежденный
Системный программист
Эксперт С++
15682 / 7192 / 1136
Регистрация: 02.05.2013
Сообщений: 11,629
Записей в блоге: 1
Завершенные тесты: 1
16.08.2013, 14:51
Цитата Сообщение от Dragokas Посмотреть сообщение
При попытке подключить библиотеку динамически (убрать все комментарии /**/ и #pragma comment) - получаю исключение (на скрине) нечто о несогласованности вызовов (строка № 62). Как будет правильно?
Объявить функцию CryptProtectData как _stdcall, а не _cdecl.

Цитата Сообщение от Dragokas Посмотреть сообщение
В упомянутой статье ничего не пишут о том, какая кодировка используется в CryptProtectData? По-умолчанию? Какая это?
Unicode. Конкретно - UTF-16 Little Endian.
Windows давно уже юникодная "внутри", а UTF-16 LE - родная для нее кодировка.

Цитата Сообщение от Dragokas Посмотреть сообщение
В примере кода MSDN тип кодировки задается строкой:
C++
1
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Но как она влияет на API функцию?
Никак. Эта строка в примере лишняя (видимо, перекочевала туда из другого примера).

Добавлено через 2 минуты
В общем, должно получиться нечто подобное:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600
 
 
 
#include <iostream>
#include <string>
#include <Windows.h>
 
#include <WinCrypt.h>
#pragma comment(lib, "Crypt32.lib")
 
#include <strsafe.h>
 
 
 
namespace
{
 
 
 
void
_stdcall
throw_exc(char const *pFormat, ...)
{
    using namespace std;
 
    va_list VaList;
    va_start(VaList, pFormat);
 
    size_t const BuffSize = 1000;
    char *pBuffer = new char[BuffSize];
    string ErrMsg;
 
    if (FAILED(StringCchVPrintfA(pBuffer, BuffSize, pFormat, VaList)))
    {
        ErrMsg = pFormat;
    }
 
    else
    {
        ErrMsg = pBuffer;
    }
 
    delete [] pBuffer;
    throw (runtime_error(ErrMsg.c_str()));
}
 
 
 
} // namespace
 
 
 
int main()
{
    using namespace std;
 
    try
    {
        wchar_t *pCmdLine = GetCommandLineW();
 
        if (NULL == pCmdLine)
        {
            throw_exc("GetCommandLineW failed with last error %lu.", GetLastError());
        }
 
        int NumArgs;
        wchar_t **pArgsArray = CommandLineToArgvW(pCmdLine, &NumArgs);
 
        if (NULL == pArgsArray)
        {
            throw_exc("CommandLineToArgvW failed with last error %lu.", GetLastError());
        }
 
        if (2 != NumArgs)
        {
            LocalFree(pArgsArray);
            throw_exc("Wrong arguments number (%lu).", NumArgs);
        }
 
        wstring const Password = pArgsArray[1];
        LocalFree(pArgsArray);
 
        DATA_BLOB BlobIn;
        DATA_BLOB BlobOut;
        BlobIn.pbData = (BYTE *)Password.c_str();
        BlobIn.cbData = static_cast<DWORD>((Password.length() + 1) * sizeof (wchar_t));
 
        if (FALSE == CryptProtectData(&BlobIn,
            L"psw",
            NULL,
            NULL,
            NULL,
            CRYPTPROTECT_UI_FORBIDDEN,
            &BlobOut))
        {
            throw_exc("CryptProtectData failed with last error %lu.", GetLastError());
        }
 
        for (DWORD i = 0; i < BlobOut.cbData; ++i)
        {
            printf("%02X", BlobOut.pbData[i]);
        }
 
        printf("\r\n");
 
        LocalFree(BlobOut.pbData);
    }
 
    catch (exception const &Exc)
    {
        cerr << "ERROR: " << Exc.what() << endl;
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru