Чтение реестра в Windows 7 ведет себя странно

Я пытаюсь прочитать значения реестра "(по умолчанию)" в 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 Client "

Теперь я из идей, может кто-нибудь указать, что случилось?

EDIT: Я проверил код со значениями "(по умолчанию)" и другими значениями, так как клавиши, которые он не работает, никогда не проходят мимо "* if (retValue == ERROR_SUCCESS)" * check, и я всегда получаю ошибку "Указанный файл не найден". Для ключей, которые он работает, он пропускает "* if (retValue == ERROR_SUCCESS) *" и возвращает значение, если его присутствует, если его нет, он просто отображает сообщение об ошибке "Указанный файл не найден".

РЕДАКТИРОВАТЬ 2: Я снова проверил: и кажется, что ключи, на которые он работает, имеют соответствующий клон в разделе "Wow6432Node" в SOFTWARE... хммм... так как я могу заставить его работать

Ответ 1

Вы можете указать флаг::

  • KEY_WOW64_32KEY "в параметре samDesired RegOpenKeyEx, если вы хотите получить доступ к ключам Wow6432Node, т.е. 32-разрядные клавиш из вашего приложения.
  • KEY_WOW64_64KEY "в параметре samDesired RegOpenKeyEx, если вы хотите получить доступ к обычным клавишам, т.е. 64-разрядный клавиш из вашего приложения.

Примечание:: Ваше сомнение уже было очищено @WhozCraig в комментариях с подходящими ссылками. Если он отвечает, прими его ответ на мой.