c++ - 在 Windows 7 中读取注册表行为异常

标签 c++ winapi windows-7

我正在尝试使用 C++ 读取 Windows 7 中注册表的“(默认)”值,以下是我正在使用的代码:

string GetSZValueUnique( HKEY openKey, const char* regkey, const char* keyName )
{
   HKEY hKey = 0;
   BYTE data[512] ;
   DWORD szsize = 512 ;
   string value ;

   LONG retValue = RegOpenKeyEx( openKey, regkey, 0, KEY_READ, &hKey ) ;

   if ( retValue == ERROR_SUCCESS )
   {
        LONG retV = RegQueryValueEx( hKey, keyName, 0, 0, data, &szsize ) ;
        if ( retV == ERROR_SUCCESS )
        {
           char* _value = reinterpret_cast<char*>(data) ;
           value = _value ;

           RegCloseKey (hKey) ;
           return value ;
        }
        else
        {
            char msg[512] ;
            FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,(DWORD)retV,0,&msg[0],512,0) ;
            error_string = &msg[0];
            MessageBox( 0, error_string.c_str(), "Query : GetSZValueUnique", 0 );
        }
    }
    else
    {
        char msg[512] ;
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,(DWORD)retV,0,&msg[0],512,0) ;
        error_string = &msg[0];
        MessageBox( 0, error_string.c_str(), "Open : GetSZValueUnique", 0 );
    }

    RegCloseKey (hKey) ;
    return "" ;
}

这就是我调用上述函数的方式:

string ts3 = GetSZValueUnique( HKEY_LOCAL_MACHINE, "SOFTWARE\\TeamSpeak 3 Client\\", "" );
if ( !ts3.empty() )
    MessageBox( 0, ts3.c_str(), "GetSZValueUnique", 0 );

对于某些 key ,它适用于某些它不适用:例如,它适用于“Adobe”、“TrendMicro”、“CheckPoint”、“RegisteredApplications”,但不适用于“7-Zip”、“RTLSetup”、“索尼克”、“TeamSpeak 3 客户端”

我现在没思路了,有人能指出哪里出了问题吗?

编辑: 我已经用“(默认)”值和其他值检查了代码,对于它不起作用的键,它永远不会超过 *“if(retValue == ERROR_SUCCESS)” * 检查,我总是收到“找不到指定的文件”错误。对于其工作的键,它通过了“*if (retValue == ERROR_SUCCESS)*”检查并返回值(如果存在),如果不存在,则仅显示错误消息“未找到指定的文件”。

编辑 2: 我再次检查:似乎它适用的键在 SOFTWARE 下的“Wow6432Node”子项中有相应的克隆...嗯...那么我该如何让它工作?

最佳答案

你可以指定标志::

  1. RegOpenKeyEx 的“samDesired”参数中的“KEY_WOW64_32KEY”如果您想访问 Wow6432Node key ,即 32 位来自您应用的 key
  2. RegOpenKeyEx 的“samDesired”参数中的“KEY_WOW64_64KEY”如果您想访问普通 key ,即64 位来自您应用的 key

注意:@WhozCraig 已经在带有合适链接的评论中消除了您的疑问。如果他回答,请接受他的回答而不是我的。

关于c++ - 在 Windows 7 中读取注册表行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15084380/

相关文章:

c# - 如何为 Windows 7 编写进度条以在任务栏上进行 self 更新?

c++ - 在 OSX Big Sur 上使用 OpenGL 4.x 进行开发

java - Qt Java - 从图库中获取图像

c - ANSI C 和 WinAPI : how to get a handle to the window from hook procedure?

c++ - 如何在 C++ 中创建文件映射?

linux - Vagrant 无法在 Windows 7 上使用 VirtualBox Guest Additions 在 Linux guest 中挂载

batch-file - 使用批处理文件创建和启动 Windows 7 或 10 服务?

c++ - 将元素插入左倾的黑红树c++

c++ - 如何一次从文本文件中读取一个字符

c++ - Winapi 设置事件选项卡控件