2013-02-26 73 views
5

我想讀註冊表的「(默認)」值,在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」,「趨勢科技」,「檢查點」,「RegisteredApplications」而不是「7-Zip」,「RTLSetup」,「Sonic」,「TeamSpeak 3客戶端」

我現在沒有想法了,有人能指出有什麼不對嗎?

編輯:我檢查了「(默認)」值和其他值的代碼,對於它不工作的鍵,它永遠不會超過*「if(retValue == ERROR_SUCCESS)」* check和I總是得到「指定的文件未找到」錯誤。對於其工作的鍵,它會通過「* if(retValue == ERROR_SUCCESS)*」檢查並返回值,如果它不存在,則只顯示錯誤消息「指定的文件未找到」。

編輯2:我再次檢查:它似乎它適用於在「Wow6432Node」子項及其相應的克隆在軟件...嗯鍵......讓我怎麼得到它的工作?

+0

你正在經歷什麼行爲?您是否手動檢查過後面的條目是否有數據? – 2013-02-26 08:23:37

+3

首先,您的應用程序是64位還是32位,其次,您是否注意到32位應用程序查找32位相關應用程序或您的64位應用程序查找64位關聯應用程序時「運行」的算法有所不同,但是當您將兩件事似乎沒有工作?如果是這樣,google [Wow6432Node](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v = vs.85).aspx)。 – WhozCraig 2013-02-26 08:29:35

+0

@ bash.d更新了原來的問題。 – StudentX 2013-02-26 08:31:01

回答

6

您可以指定標誌::

  1. KEY_WOW64_32KEY」 在RegOpenKeyEx的 「samDesired」 參數,如果你想訪問Wow6432Node鍵即32位密鑰從你的應用。
  2. KEY_WOW64_64KEY」在RegOpenKeyEx的「samDesired」參數,如果你想訪問正常鍵即64位密鑰從您的應用程序。

注意::您的疑問已經通過@WhozCraig在適當的鏈接評論中被清除。如果他回答,請接受他對我的回答。