C++ 操作64位系统,默认读取Wow6432Node子键的解决方法。
原先一個(gè)win32程序好好地,由于組里不少人用了win 7 64位操作系統(tǒng),指出原程序有bug,程序不能在64位的操作系統(tǒng)上跑。搞了很久,后來(lái)網(wǎng)上搜到一些資料說(shuō):64位的操作系統(tǒng):
xp下具體的程序在電腦中的位置位于:
HKEY_LOCAL_MACHINE\SOFTWARE
vista中是位于
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
如果你在vista64下面依然訪問(wèn)如下位置,
HKEY_LOCAL_MACHINE\SOFTWARE
你得到的其實(shí)就是vista下
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
的列表。
這其中其實(shí)是WOW進(jìn)行了轉(zhuǎn)換。其中并給出了判斷64位還是32位平臺(tái)的函數(shù):
IsWow64返回TRUE則是64位系統(tǒng),否則為32位系統(tǒng)。
code如下:VC測(cè)試通過(guò)
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;?
}
??
?? 然而,奇怪的是:當(dāng)我們判斷為: IsWow64()時(shí),我便將注冊(cè)表的地址必為:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\我要讀的程序名
? 依然讀取不成功。后來(lái)請(qǐng)教了一位老同事,他說(shuō)這種問(wèn)題,應(yīng)該看微軟的最新的msdn。隨即搜了搜,發(fā)現(xiàn):
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.
意思是說(shuō):訪問(wèn)時(shí),不要去打開(kāi)Wow6432Node ,而應(yīng)在API里使用 KEY_WOW64_64KEY 。
?
?
?
?最后,在64位的機(jī)器上跑時(shí),使用KEY_WOW64_64KEY標(biāo)識(shí):
retCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,subKeyName.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE,
???KEY_EXECUTE|KEY_WOW64_64KEY, NULL, &hkey, NULL);
問(wèn)題果然解決了!
???????? 加油!征途才剛剛開(kāi)始!
總結(jié)
以上是生活随笔為你收集整理的C++ 操作64位系统,默认读取Wow6432Node子键的解决方法。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PE文件结构详解(六)重定位
- 下一篇: QT学习笔记(1)----- QT简介