2012-04-27 30 views
2

以下C++/CLI代碼將nullptr返回給pKey。OpenSubKey在C++中的行爲與在C#中的行爲不同

RegistryKey^ pKey = Microsoft::Win32::Registry::LocalMachine->OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders"); 

的下面C#代碼返回一個有效的指針PKEY。

RegistryKey pKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders"); 

除了語言差異,這兩個代碼片段看起來與我完全相同。

我剛剛發現,在x64中構建C++代碼允許它找到密鑰。所以我的問題是現在如何在32位版本中找到密鑰?我需要在兩個版本中找到它。

謝謝。

+0

我只是spitballing,所以我真的不能張貼此作爲一個答案,但有可能是有在傳遞的字符串參數的差異?也許C++/CLI值傳遞的是ASCII字符串,並且C#代碼不使用ASCII編碼。 – BTownTKD 2012-04-27 13:57:53

回答

7

這無疑是平臺目標的一個副作用。在64位操作系統上,HKLM/Software密鑰被重定向到32位進程HKLM/Software/Wow6432Node。您正在尋找的特定密鑰不存在。

因此,C#代碼工作的可能性很大,因爲它定位於AnyCPU,因此可以在64位模式下運行。而且C++/CLI代碼無法工作,因爲它的目標是Win32。對於C++/CLI沒有AnyCPU模式,您必須明確地選擇x64和Win32。包含本機代碼的C++/CLI程序集的副作用。

在.NET 4中,RegistryKey類有一個額外的OpenBaseKey()方法,允許指定註冊表視圖。早期版本沒有簡單的解決方法。考慮在您的C++/CLI項目中添加x64平臺。或者使用本地的winapi函數,而不是C++/CLI的實力。

+0

使用本機函數RegOpenKeyEx並將KEY_WOW64_64KEY分解到第四個參數samDesired中,該函數用於在64位計算機上運行的32位版本中訪問註冊表。 – 2012-05-02 18:23:40

2

嘗試在C打開++與標準型

LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders", 0, KEY_READ, &hKey);