Как использовать CredUICmdLinePromptForCredentials?
Меня пытались написать приложение, использующее функцию, которую никто не использует (CredUICmdLinePromptForCredentials). Но результат неправильный, переменная пользователя и прохода выводится в виде шестнадцатеричных значений.
Это мой код:
#include <windows.h>
#include <wincred.h>
#include <iostream>
#pragma comment(lib,"Credui.lib")
int main()
{
DWORD dwErr;
WCHAR szUserName[CREDUI_MAX_USERNAME_LENGTH] = {NULL};
WCHAR szPassword[CREDUI_MAX_PASSWORD_LENGTH] = {NULL};
BOOL fSave;
DWORD dwAuthError=1223;
dwErr = CredUICmdLinePromptForCredentials(
L".",
NULL,
dwAuthError,
(PWSTR)&szUserName,
CREDUI_MAX_USERNAME_LENGTH + 1,
(PWSTR)&szPassword,
CREDUI_MAX_PASSWORD_LENGTH + 1,
&fSave,
CREDUI_FLAGS_DO_NOT_PERSIST|CREDUI_FLAGS_EXCLUDE_CERTIFICATES
);
if (dwErr == ERROR_SUCCESS)
{
std::cout << "User Name: " << szUserName << std::endl;
std::cout << "Password : " << szPassword << std::endl;
}
else if (dwErr == ERROR_CANCELLED)
{
std::cout << "User cancelled the operation." << std::endl;
}
else
{
std::cout << "Error occurred: " << dwErr << std::endl;
}
return 0;
}
Вот результат:
Имя пользователя: 000000C5402FED80
Пароль: 000000C5402FF1B0
Если я изменю код триггера ERROR_SUCCESS на:
std::cout << "User Name: " << char(szUserName[0]) << std::endl;
std::cout << "Password : " << char(szPassword[0]) << std::endl;
все работает успешно, символы отображаются правильно.
1 ответ
Пожалуйста, взгляните наszPassword
иszUserName
. Это имеет следующее определение:
WCHAR szUserName[CREDUI_MAX_USERNAME_LENGTH] = {NULL};
WCHAR szPassword[CREDUI_MAX_PASSWORD_LENGTH] = {NULL};
в то время как мы печатаем строки как , который принимает только строки ASCII, илиchar
,const char
,char*
,const char*
.
Это должно быть следующее:
std::wcout << L"User Name: " << szUserName << std::endl;
std::wcout << L"Password : " << szPassword << std::endl;
(потому чтоstd::wcout
предназначен для строк Unicode иstd::cout
нет.)