
因此,我們的一位客戶在舊版 Windows 版本上使用我們的軟體,因為他們處於工業、隔離環境中,並且他們擁有 Windows XP 和一堆舊伺服器,這是唯一適合他們的東西。其中一些是 64 位元的。
閱讀註冊表時我注意到,在某些情況下,我們的 32 位元應用程式實際上可以直接讀取 64 位元 Window 上的以下條目 - 理論上這是不可能的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer
並從字串值“Version”中提取版本號。
但是,如果我們在同一台 PC 上建立一個金鑰(例如)
HKEY_LOCAL_MACHINE\SOFTWARE\Our Software
並新增一個字串值(例如「上次服務」),則無法讀取該金鑰。
當我們嘗試將其新增至其中時,權限和所有權與 IE 條目相同,但無濟於事。
當然,使用是\\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Our Software\Last Service Date
可行的,但為什麼如果其他一些東西可以進入註冊表的“正常”部分並且可讀,有些則不能呢?從應用程式中提取資料來讀取服務日期時會更容易、更清晰,如果不小心將其錯誤地添加到標準 HKEY_LOCAL_MACHINE 中,則至關重要。
我錯過了什麼嗎?
答案1
您遇過 註冊表重定向器:
註冊表重定向器透過在 WOW64 上提供註冊表某些部分的單獨邏輯視圖來隔離 32 位元和 64 位元應用程式。註冊表重定向器會攔截對其各自邏輯註冊表視圖的 32 位元和 64 位元註冊表調用,並將它們對應到相應的實體註冊表位置。重定向過程對應用程式是透明的。因此,32 位元應用程式可以像在 32 位元 Windows 上運行一樣存取註冊表數據,即使數據儲存在 64 位元 Windows 上的不同位置也是如此。
某些應用程式註冊表項(例如HKEY_LOCAL_MACHINE\Software
始終重定向)。大多數註冊表配置單元都沒有重定向。
32/64 位元程式仍然可以透過在請求中包含特殊標誌來強制存取 64/32 位元版本的註冊表,如文章中所述 存取備用註冊表視圖。也可以看看 WOW64 上的登錄重定向範例。