Как использовать 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нет.)

Другие вопросы по тегам