2013年6月25日 星期二

32-bits、64-bits 作業系統的 Registry 注意事項

在 64-bits 的作業系統下執行 32-bits 的應用程式時,若需要寫入 Registry 時,會發現機碼被作業系統預設寫入 Wow6432Node 的目錄底下,不論是 HKEY_CURRENT_USER 還是 HKEY_LOCAL_MACHINE 皆相同。

HKEY_CURRENT_USER\Software\ 底下寫入機碼就會預設出現在 HKEY_CURRENT_USER\Software\Wow6432Node\ 的同樣位置
同理在 HKEY_LOCAL_MACHINE\SOFTWARE\ 底下寫入機碼,就會出現在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 底下相同的位置

位置不變,只是多了一層 Wow6432Node 的資料夾,這是為了做 32-bits 應用程式與 64-bits 作業系統的對應而產生的結果。

其實一般來說不太需要特別注意這件事,應用程式的寫作上以原本的路徑在讀寫就行了,要不要指向 Wow6432Node 完全由作業系統來決定,但是有些例外,如果某些值作業系統只會去參考在原本的非 Wow6432Node 路徑下時,而這個值被寫到 Wow6432Node 的位置下就沒辦法發揮預期的效果了,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\ 就是一個例子,如果有一個 32-bits 的應用程式在此處寫入機碼,依前面所言,會被寫到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\\Microsoft\Windows\Windows Error Reporting\LocalDumps\ 裡面,而這樣是無效的,因為作業系統只會參考原本非 Wow6432Node 底下的機碼。

所以我們可加入一個新的參數,指定 32-bits 的應用程式在 64-bits 的作業系統下建立、讀取、寫入機碼時,不要在 Wow6432Node 下執行,而是在原本的位置做寫入,可以參考 MSDN 的說明:Accessing an Alternate Registry View

參數分別為 KEY_WOW64_64KEY:Access a 64-bit key from either a 32-bit or 64-bit application.
與 KEY_WOW64_32KEY:Access a 32-bit key from either a 32-bit or 64-bit application.

以 RegCreateKeyEx 作示範就像這樣

if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\Windows Error Reporting\\LocalDumps\\MyApp.exe"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_WOW64_64KEY, NULL, &hKey, &disp))
{
return;
}


如此 MyApp.exe 這個機碼就不會出現在 Wow6432Node 底下,而是正常 64-bits 作業系統該放的 Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\ 位置底下

沒有留言:

張貼留言