2017-05-13 28 views
0

我尝试了几个代码,用于从注册表中加载字符串键,并在测试它们后发现了我写下来的这一个。但一个非常令人困惑的事情是,这段代码对于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"; 
+0

呼叫'GetLastError'和更新,结果你的帖子。 –

+0

@RichardCritten我不熟悉GetLastError,但将其插入我的代码中,并返回0值。在我的主代码成功打开regKey后RegQueryValueEx面对错误并且调试器跳转到“无法查询关键值”行 –

+0

刚刚阅读了关于“RegQueryValueEx”的文档,了解了返回结果,它不返回布尔值:请参阅: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx请参阅链接中的示例 –

回答

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; 
+0

谢谢你的回答。我尝试了一些注册码的代码,但没有加载它们。 lRes返回2为某些键和234为其他一些键。我检查我的注册表权限,没有任何问题。我作为管理员运行我的程序,但它不工作! –

+0

什么令人困惑的是,我可以从一些根打开一些密钥,但我不能读我自己的密钥创建在一个特殊的根! –

+0

错误2是'ERROR_FILE_NOT_FOUND',错误234是'ERROR_MORE_DATA'。两者都在['RegQueryValueEx'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911.aspx)文档中解释:“*如果'lpValueName'指定了一个不在在注册表中,该函数返回'ERROR_FILE_NOT_FOUND' ...如果由'lpData'参数指定的缓冲区不足以容纳数据,则函数返回'ERROR_MORE_DATA'并将所需的缓冲区大小存储在'lpcbData指向的变量中在这种情况下,'lpData'缓冲区的内容是不确定的。*“ –