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);
問題果然解決了!
加油!征途才剛剛開始!