(從大衛赫弗南試圖建議後更新)當心的Windows 8.1註冊表中讀取虛擬化並不適用於64位應用程序
我有一個傳統的Win32本機應用程序(德爾福6)該HKEY_LOCAL_MACHINE下寫入值註冊表\ Software \\鍵。這些值稍後將被幾個其他傳統Win32本機應用程序和一個新的.NET應用程序讀取。 .NET應用程序構建AnyCPU,因此以64位圖像的形式執行。因爲它使用32位應用程序編寫的配置,.NET軟件將其註冊表讀取重定向到Win32 API應用程序實際寫入的Wow6432Node。
沒有任何應用程序正在運行提升。 所有應用程序都是交互式的。 用於運行應用程序的帳戶具有對HKEY_LOCAL_MACHINE \ Software \\註冊表項及其子項的明確「完全控制」。
據我所知,這不是使用註冊表虛擬化,因爲32位應用程序有寫訪問他們寫到HKLM鍵。
此方案在64位Windows 7和64位Windows 8計算機上工作得很好,但在新的Windows 8.1 64位計算機上都不工作。
雖然傳統的Win32應用程序寫入註冊表沒有錯誤,它現在似乎正在虛擬化。這可以通過查看用戶虛擬化註冊表項來確認;我看到裏面所有的書面價值。
當我使用REGEDIT查看HKEY_LOCAL_MACHINE \ Software \\鍵時,我寫的大約一半的鍵只是從HKEY_LOCAL_MACHINE \ Software \\中丟失,但都存在於虛擬化文件夾中。
據我所知,它與32位應用程序寫權限應該沒有虛擬化,但有。更糟的是,當我讀取非虛擬化密鑰時,我看到一些但並非全部寫入虛擬化商店的值。
爲什麼它突然虛擬化寫入,爲什麼當讀取原始密鑰(即虛擬讀取未按預期工作)時讀取不顯示所有虛擬值?
我認爲這必須是一個權限問題,就好像我運行應用程序「作爲管理員」的關鍵都在那裏。然而,運行提升不是允許的最終配置。
更新
我清理了這臺機器上的所有註冊表設置。無論是HKCU下的虛擬商店還是HKLM下的共享區域。然後再次開始,沒有升高。這導致了類似的症狀,但是這次我只能看到HKLM密鑰中的一個密鑰。
我的打算寫一個Win32應用程序來枚舉HKEY_LOCAL_MACHINE \ SOFTWARE \\鍵的情況下,我正被一些REGEDIT.EXE所愚弄,或者在64位操作系統上運行,並且會更新時,是不是做對我來說我有結果。得到它與傳統的32位WinAPI應用程序和新的64位應用程序之間的虛擬化不匹配。詳情請參閱我的回答。
如果我有任何選擇,我不會使用它,但發展需要時間和成本的錢,現在有一點愛花錢來修復「工作」的傳統應用程序。 –
我會嘗試一下這個建議(我們的Windows 8 64位機器上的一切看起來都很好),看看它是否會將事情排序。 –
事情是不行的。只要有人跑高架,一個扳手就會投入工作。您只需寫信給HKCU而不是HKLM即可。 –