-1

我使用此处的答案以编程方式将凭据添加到 Windows 凭据管理器。该代码的灵感来自答案中的代码。但是,当我运行它时,信用管理器中的凭据以普通话显示。我不确定我做错了什么。将不胜感激任何指针。蒂亚。

对于参考,这是我的代码

#include <iostream>
#include "windows.h"
#include "wincred.h"
#pragma hdrstop

using namespace std;

int main()
{
    const char* password = "testpass";
    CREDENTIALW creds = { 0 };
    creds.Type = CRED_TYPE_GENERIC;
    creds.TargetName = (LPWSTR)("testaccount");
    creds.CredentialBlobSize = strlen(password) + 1;
    creds.CredentialBlob = (LPBYTE)password;
    creds.Persist = CRED_PERSIST_LOCAL_MACHINE;
    creds.UserName = (LPWSTR)("testuser");

    BOOL result = CredWriteW(&creds, 0);

    if (result != TRUE)
    {
        cout << "Some error occurred" << endl;
    }
    else
    {
        cout << "Stored the password successfully" << endl;
    }
    return 0;
}

为了确保没有默认语言问题,我在 test.com 的凭证管理器中手动创建了一个凭证,并且没有任何问题。Cred Manager 的快照 -

在此处输入图像描述

4

1 回答 1

0

显然,TargetName 需要引用一个可变数组,即不是字符串文字。它还需要是一个字符串,否则字符会被错误解释,在这种情况下会导致汉字。

解决方案是定义一个用宽字符串初始化的可变数组,并TargetName指向它:

WCHAR targetName [] = L"testuser";
creds.TargetName = targetName;

这样,不需要可疑的演员表就可以编译。当您想要输入非硬编码字符串(例如来自用户输入或文件)时,您需要确保它们被正确编码并正确转换

于 2019-12-19T10:19:44.560 回答