阅读Windows 7中的注册表行为奇怪

时间:2013-02-26 08:19:19

标签: 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 );

对于某些键,它适用于某些键不适用:例如,它适用于“Adobe”,“TrendMicro”,“CheckPoint”,“RegisteredApplications”,但不适用于“7-Zip”,“RTLSetup”,“ Sonic“,”TeamSpeak 3客户“

我现在没有想法,有人可以指出什么是错的吗?

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

编辑2:我再次检查:似乎它所用的密钥在“软件”下的“Wow6432Node”子项中有相应的克隆...嗯......所以如何使其工作?

1 个答案:

答案 0 :(得分:7)

您可以指定标志::

  1. &#34;的 KEY_WOW64_32KEY &#34;在&#34; samDesired &#34; RegOpenKeyEx 的参数,如果您想从您的应用访问Wow6432Node密钥,即 32位密钥
  2. &#34;的 KEY_WOW64_64KEY &#34;在&#34; samDesired &#34; RegOpenKeyEx 的参数,如果您想从您的应用中访问普通密钥,即 64位密钥
  3. 注意:: @WhozCraig在评论中已经通过合适的链接清除了您的疑问。如果他回答,请接受他对我的回答。