Windows 7中的Reading Registry行为异常

Reading Registry in Windows 7 behaving strangely

本文关键字:异常 Registry Reading 中的 Windows      更新时间:2023-10-16

我正试图在c++中读取Windows7中注册表的"(默认("值,下面是我正在使用的代码:

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 Client">

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

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

编辑2:我再次检查:它工作的密钥似乎在软件下的"Wow6432Node"子密钥中有相应的克隆。。。嗯……那么我该怎么让它工作呢?

您可以指定标志::

  1. 如果您想从应用程序访问Wow6432节点密钥,即32位密钥,请在RegOpenKeyEx的">samDesired"参数中选择">KEY_WOW64_32KEY
  2. ">KEY_WOW64_64KEY"在RegOpenKeyExsamDesired"参数中,如果您想从应用程序访问普通密钥,即64位密钥

注:@WhozCraig已经通过适当的链接在评论中澄清了您的疑问。如果他回答,一定要接受他的回答而不是我的回答。