C ++ - 从注册表中读取值的空值

时间:2016-01-17 17:08:16

标签: c++ winapi registry

我的应用程序正确读取和写入注册表。现在,我需要从以下位置读取注册表值:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid

这是我的代码:

bool GetWindowsID(string &winID)
{
    HKEY hKey = 0, hKeyType = HKEY_LOCAL_MACHINE;
    bool status = false;
    DWORD dwType = 0;
    DWORD dwBufSize = 256;
    char value[256] = "\0";
    if (RegOpenKeyEx(hKeyType, L"SOFTWARE\\Microsoft\\Cryptography", NULL, KEY_QUERY_VALUE|KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS)
    {
        dwType = REG_SZ;
        if (RegQueryValueEx(hKey, L"MachineGuid", NULL, &dwType, (LPBYTE)value, &dwBufSize) == ERROR_SUCCESS)
            status = true;
        RegCloseKey(hKey);
    }
    winID.assign(value);
    return status;
}

我得到guid但是在每个字符之后的value数组中它们是一个“\ 0”值,因为只有第一个数组字符被赋值给字符串。这很奇怪!

enter image description here

2 个答案:

答案 0 :(得分:4)

您已构建定位Unicode,因此注册表API将返回UTF-16 Unicode文本。而不是<?php $urls = array ( "id=1.php", "id=2.php", "id=3.php" ); $random = (rand()%3); header ("Location: ".$urls[$random]); exit; ?> 使用char并记住每个wchar_t元素的宽度为2个字节。

还要确保考虑到返回的字符串不是以空值终止的,如文档中所述。您必须考虑wchar_t中返回的值。

答案 1 :(得分:4)

  

我得到guid但是在每个字符之后的值数组中它们是“\ 0”   由于只有数组的第一个字符被赋值的值   串。这很奇怪!

这是因为您正在调用Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor 的Unicode版本,因此字符串以Unicode(UTF-16)返回。

您必须使用宽字符参数来获取值。

更改此行:

RegQueryValueEx()

改为使用char value[256] = "\0";