1. 程式人生 > >C++ 操作64位系統,預設讀取Wow6432Node子鍵的解決方法。

C++ 操作64位系統,預設讀取Wow6432Node子鍵的解決方法。

原先一個win32程式好好地,由於組裡不少人用了win 7 64位作業系統,指出原程式有bug,程式不能在64位的作業系統上跑。搞了很久,後來網上搜到一些資料說:64位的作業系統:

xp下具體的程式在電腦中的位置位於:
HKEY_LOCAL_MACHINE\SOFTWARE
vista中是位於
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
如果你在vista64下面依然訪問如下位置,
HKEY_LOCAL_MACHINE\SOFTWARE
你得到的其實就是vista下
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
的列表。
這其中其實是WOW進行了轉換。其中並給出了判斷64位還是32位平臺的函式:
IsWow64返回TRUE則是64位系統,否則為32位系統。
code如下:VC測試通過
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process; 
BOOL IsWow64() 

    BOOL bIsWow64 = FALSE; 
    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( 
        GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); 
    if (NULL != fnIsWow64Process) 
    { 
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) 
        { 
            // handle error 
            AfxMessageBox("IsWow64 error!"); 
        } 
    }
    return bIsWow64; 
}

   然而,奇怪的是:當我們判斷為: IsWow64()時,我便將登錄檔的地址必為:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\我要讀的程式名

  依然讀取不成功。後來請教了一位老同事,他說這種問題,應該看微軟的最新的msdn。隨即搜了搜,發現:

Do not try to open Wow6432Node to view the alternate registry hive in 32-bit code. Instead open the desired branch (e.g., HKLM\Software\Microsoft\xxx) with the KEY_WOW64_64KEY flag as shown above.

意思是說:訪問時,不要去開啟Wow6432Node ,而應在API裡使用 KEY_WOW64_64KEY 。

 最後,在64位的機器上跑時,使用KEY_WOW64_64KEY標識:

retCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,subKeyName.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE,
   KEY_EXECUTE|KEY_WOW64_64KEY, NULL, &hkey, NULL);

問題果然解決了!

         加油!征途才剛剛開始!