RegQueryValueEx获得一个奇怪的值

时间:2010-07-16 22:16:29

标签: c++ c visual-c++

我正在尝试从注册表中检索一些值。 这是完整的路径: [HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \主题] “ThemeChangesMousePointers”= 0x00000001(1)

这是我的代码:

HKEY hKey;
DWORD dwDisp = REG_DWORD;
DWORD dwType;
DWORD dwSize = sizeof(DWORD);
DWORD dwValue = 0;
DWORD dwReturn;
char buffer[255] = {0};
//char* buffer;
//DWORD buffer = 0;
DWORD dwBufSize = sizeof(buffer);

if( RegOpenKey(HKEY_LOCAL_MACHINE,
    _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes")
    ,&hKey) == ERROR_SUCCESS)
{
    dwType = REG_DWORD;
    if( RegQueryValueEx(hKey,_T("ThemeChangesMousePointers"),0, &dwType, (LPBYTE) buffer, &dwBufSize) == ERROR_SUCCESS)
    {
        printf("Key value is: %d \n", buffer);
        printf("GetLastError reports %d \n", GetLastError());
    }
    else
    {
        printf("Cannot query for key value \n");
    }
}

我已经尝试过调试,看起来我的缓冲区输出变量给了我一个奇怪的输出:

键值为:2554292 错误是0

每次我再次运行代码时,我都会得到不同的值。我怎样才能获得真正的价值而不是另一个呢?

编辑:上面的帖子已被编辑,以提出另一个问题。

另外,如果这不是足够的代码,我可以添加更多。

1 个答案:

答案 0 :(得分:5)

RegQueryValueEx不会调用SetLastError,而是直接返回错误代码。

  

返回值

     

如果函数成功,则返回值为ERROR_SUCCESS   如果函数失败,返回值是系统错误代码。
  如果lpData缓冲区太小而无法接收数据,则该函数返回ERROR_MORE_DATA   如果lpValueName注册表值不存在,则该函数返回ERROR_FILE_NOT_FOUND。

编辑回应评论:

我最初回答了您的具体问题,关于您发布的代码,仍然存在一些问题:

  • 您正在调用已弃用的方法RegOpenKey而不是RegOpenKeyEx。
  • 您正在尝试读取整数但是您将其作为char *字符串读取。这是你得到问题的最可能原因......函数返回一个整数,但你把它打印成一个字符串。
  • 您的IF条件是向后的
HKEY hKey;
DWORD dwDisp = REG_DWORD;
DWORD dwSize = sizeof(DWORD);
DWORD dwValue = 0;
DWORD dwReturn;
DWORD dwBufSize = sizeof(DWORD);

if( RegOpenKeyExW(HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes"
    ,0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
    DWORD error = RegQueryValueExW(hKey,L"ThemeChangesMousePointers",0,0, reinterpret_cast<LPBYTE>(&dwReturn), &dwBufSize);
    if(error == ERROR_SUCCESS)
    {
        printf("Key value is: %d \n", dwReturn);
    }
    else
    {
        printf("Cannot query for key value; Error is: %d\n", error);
    }
}
RegCloseKey(hKey);