C++ 从注册表读取MachineGuid

C++ 从注册表读取MachineGuid,c++,windows,registry,C++,Windows,Registry,我正在尝试手动从注册表读取MachineGuid。这是可行的,RegQueryValueEx提供了我正在寻找的值,但是每个字符后面都有一个空终止字符,为什么会发生这种情况 代码: 结果是: 这只显示我的MachineGuid的1个字符,它以“f”开头。因此,我在Visual Studio中添加了一个断点,以在regquery调用后检查dwMHz数组的值,结果如下: 那么为什么我的结果数组被空终止字符污染了呢?您已经将一个Unicode字符串读入了一个字符缓冲区。您正在读取一个utf-16编码

我正在尝试手动从注册表读取MachineGuid。这是可行的,RegQueryValueEx提供了我正在寻找的值,但是每个字符后面都有一个空终止字符,为什么会发生这种情况

代码:

结果是:

这只显示我的MachineGuid的1个字符,它以“f”开头。因此,我在Visual Studio中添加了一个断点,以在regquery调用后检查dwMHz数组的值,结果如下:


那么为什么我的结果数组被空终止字符污染了呢?

您已经将一个Unicode字符串读入了一个字符缓冲区。您正在读取一个utf-16编码的字符串,每个字符占用2个字节。通常第二个字节是0,如果是中文或重音字符,则不会是0。您应该这样做,但是可以通过使用RegQueryValueExA将时钟拨回到上个世纪。而FormatMessageA,您提出了LPWSTR转换,因为编译器已经试图告诉您您做得不对。它不起作用。@Hans错误部分实际上取自一个示例。我会尽量只用ASCII码,谢谢。用wchar\u t代替char
string read_reg_sz() 
{
    char Buffer[_MAX_PATH];
    char dwMHz[_MAX_PATH] = {0};
    DWORD BufSize = _MAX_PATH;
    DWORD dataType = REG_SZ;
    HKEY hKey;
    long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Cryptography"), NULL, KEY_READ | KEY_WOW64_64KEY, &hKey);
    if (lError != ERROR_SUCCESS)
    {
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            lError,
            0,
            (LPWSTR)Buffer,
            _MAX_PATH,
            0);
        cout << lError << endl;
        return "N/A";
    }
    int val = RegQueryValueEx(hKey, L"MachineGuid", NULL, &dataType, (LPBYTE)&dwMHz, &BufSize);
    if (val == ERROR_SUCCESS)
        cout << "succes!" << endl;
    else
        cout << "failed!" << endl;
    RegCloseKey(hKey);
    cout << "\n reg data read: " << dwMHz;
    return dwMHz;
}