2012-05-10 121 views
13

我需要在C++中打開註冊表項"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"。它包含Java 64位應用程序。該註冊表項的完整路徑是"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"從32位應用程序訪問64位註冊表

我們可以通過註冊表查看這條路徑。我使用

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey) 

用於打開註冊表;但它返回錯誤值(2)。

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")... 

返回成功的結果。我能做什麼?

+0

它是一個32位應用程序? –

回答

-2

錯誤2意味着註冊表路徑不存在。

確認鍵{26A24AE4-039D-4CA4-87B4-2F86416024FF}下SOFTWARE \微軟\的Windows \ CurrentVersion \卸載

+3

注意OP說:「我們可以通過註冊表查看此路徑。」 – PlasmaHH

24

爲32位和64個應用程序的註冊表項是分開的,你可以實際存在無法直接訪問32位應用程序的64位註冊表。在你的情況下,註冊表的32位部分中不存在所需的配置單元,那麼你只能訪問父文件夾。

從MSDN:

在64位Windows中,註冊表項的多個部分被分別用於32位應用程序和64位應用程序存儲並映射到使用註冊表重定向器和註冊表單獨的邏輯註冊表視圖反射,因爲64位版本的應用程序可能使用不同的註冊表項和值,而不是32位版本。還有一些共享的註冊表鍵沒有被重定向或反映。

你可以閱讀MSDN名單:Registry Keys Affected by WOW64。不幸的是SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall沒有被提及,但它也受到了影響。

解決方案
你所要做的就是明確RegOpenKeyEx訪問註冊表的64位部分。可以將KEY_WOW64_64KEY標誌添加到您的調用中(您可以使用KEY_WOW64_32KEY從64位應用程序訪問32位註冊表)。請注意,Windows 2000不支持此標誌,那麼如果您的應用程序必須與該(舊)版本兼容,則必須管理該案例。

有關更多詳細信息,請參閱MSDN上的此鏈接:Accessing an Alternate Registry View

爲了方便,只需更改您的通話邀請:

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey); 

到:

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey); 

注意
請注意,您只能通過其路徑訪問鍵,但不任何標誌使用此HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall。 因爲Wow6432節點是WOW64使用的虛擬化節點,但你不應該依賴於這個,這是穩定的,但它應該被視爲一個實現細節可能會改變。

參考文獻
- Registry Virtualization MSDN上。
- 讀者我覺得對這個職位感興趣提示:http://poshcode.org/2470,它是PowerShell的,但它說明了如何從32位應用程序訪問WMI數據(相對於64位註冊表部分)。

+0

謝謝你...它的工作... –

+0

@ adriano-repetti關於該注意:是不是Wow6432Node只存儲32位密鑰的地方?您可以在64位模式下通過它們的路徑訪問32位密鑰,但不能以其他方式訪問。 – Valdimar

+0

@vladimir是與路徑,您可以訪問從64位應用程序32位註冊表沒有標誌,但相反的是不可能的。然而,有了旗幟,你可以用兩種方式。 –

相關問題