win32程序讀寫win7 64位操作系統的註冊表
原先一個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 。
參考鏈接:http://msdn.microsoft.com/en-us/library/aa384129(v=VS.85).aspx
最後,在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);
問題果然解決了!