加载注册表项错误

时间:2017-05-13 12:42:13

标签: c++ registry

我尝试了几个代码来从注册表加载一个字符串密钥,在测试它们之后我发现了这个我写下来的。但是一个非常令人困惑的事情是这个代码适用于HKEY_LOCAL_MACHINE / HARDWARE密钥,但不适用于SOFTWARE。我不知道我忽略了什么?

char rgValue [512];
char fnlRes [512];
DWORD size1;
DWORD Type;
HKEY hKey = 0;
char buf[512] = {0};
DWORD dwType = 0;
DWORD dwBufSize = sizeof(buf);

if(  RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS)
{
    dwType = REG_DWORD;
    if( RegQueryValueEx( hKey, TEXT("test"), 0, &dwType, (LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS)
    {
        cout << "key value is '" << buf << "'\n";
    }
    else
        cout << "can not query for key value\n";
    RegCloseKey(hKey);
}
else
    cout << "Can not open key\n";

1 个答案:

答案 0 :(得分:0)

您似乎正在从注册表中读取DWORD值,但您尝试将其输出到控制台,就好像它是一个以空字符结尾的字符串。要阅读DWORD,请将缓冲区变量从char[]更改为DWORD,并使用&运算符将其地址传递给RegQueryValueEx(),例如:

HKEY hKey = 0;
DWORD dwValue = 0;
DWORD dwType = 0;
DWORD dwBufSize = sizeof(dwValue);
LONG lRes;

lRes = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey );
if (lRes == ERROR_SUCCESS)
{
    lRes = RegQueryValueEx( hKey, TEXT("test"), 0, &dwType, (LPBYTE)&dwValue, &dwBufSize );
    if (lRes == ERROR_SUCCESS) 
    {
        if (dwType == REG_DWORD)
            cout << "key value is " << dwValue << endl;
        else
            cout << "key value is not a DWORD" << endl;
    }
    else
        cout << "can not query for key value. Error: " << lRes << endl;
    RegCloseKey(hKey);
}
else
   cout << "Can not open key. Error: " << lRes << endl;