2011-11-21 36 views
9

我被困在一個Windows 7註冊表問題上,雖然各種問題和答案讓我有一些方式,但我見過的沒有解決我的特定問題。我不知道其他的Windows版本是否會影響這個問題,但我們都有win7x64機器。爲什麼我無法在64位機器上正確讀取HKCU中的32位註冊表值?

在我們的工作中,我們有各種各樣的工具,一些C++,一些C#,一些Python(2.6)等。我們也運行32位和64位工具的混合。過去,我們很高興地在HKLM中存儲註冊表信息。我們一直在努力把東西搬到HKCU。我們已經討論過是否這樣做,對UAC產生影響等。我們真的想嘗試做這個動作。這就是說:

我們無法從HKCU/software/CompanyABC/App中讀取/寫入註冊表項。我們有一個安裝應用程序在python中寫入,它使用_winreg將註冊表鍵寫出到上述位置。無論我們指定KEY_WRITE | KEY_WOW64_32KEY還是僅指定KEY_WRITE,值都會寫入HKCU/Software/WOW6432Node/companyABC/app。精細。

然後我有一個C#應用程序,試圖讀取這些值。使用Microsoft.Win32.Registry,我打開子項('HKCU/Software/CompanyABC/app'),但沒有看到我的值。原來,我看到以下行爲:

  • 從HKLM讀取/寫入註冊表項時,這些東西都可以使用。 python應用程序將寫入HKLM/Softare/Wow6432Node/CompanyABC/app,並且C#代碼將從該位置讀取。考慮到我們正在構建我們的C#應用​​程序,並通過python編寫註冊表值,這一切都有合理的意義。
  • 從HKCU讀取/寫入註冊表值,我會得到不同的行爲。 _winreg函數將寫入HKCU/Sofrware/Wow6432Node/CompanyABC/app,但C#應用程序將從HKCU/Software/CompanyABC/app讀取。 C#應用程序構建爲x86應用程序(不是任何CPU而不是x64),因此我認爲該應用程序將被正確重定向到wow6432Node,但似乎不是。

經過一番調查,似乎HKCU /軟件是不同的。文章似乎表明這個區域是「共享」的而不是重定向的。如果是這種情況,那麼我不明白爲什麼我們的python應用程序(再次使用_winreg)寫入到使用Wow6432Node的HKCU中的某個位置 - 似乎應該在沒有重定向的情況下寫入它。我想這可能是_winreg中的一個錯誤。

我真的想避免在WOW6432Node上直接粘貼我們的工具,但這就是我今天所處的位置。任何人都可以向我解釋我怎樣才能使32位和64位進程的註冊表訪問正確地進入HKCU,而無需使用硬編碼路徑進入32位配置單元?

+0

當我第一次切換到Windows Vista時,整個註冊表虛擬化系統(在32/64位問題上)使我決定再也不要使用註冊表。我知道這可能是不可能的,但如果你可以切換到別的東西(例如配置文件),我強烈建議這樣做。 –

+0

無法重現此操作。對我來說,Python 2.6。6(32位和64位)在Windows 7 64位讀/寫HKCU/Software/companyABC /應用程序按預期方式(不是HKCU /軟件/ WOW6432Node/companyABC /應用程序)。 – cgohlke

+0

謝謝cgohlke。我會再看看這裏發生了什麼。我很欣賞後續。 – Mark

回答

4

我從對問題的評論中瞭解到,對於遇到此問題的其他人,您可以使用Microsoft.Win32.OpenBaseKey來指定在運行即使您的進程以32位進程運行,也是64位計算機。

如果您始終想要訪問註冊表的NON-WOW6432Node部分中的鍵,則可以安全地將OpenBaseKey的View參數設置爲RegistryView .Registry64。這將在64位和32位操作系統上正常工作。

相關問題