2013-10-18 63 views
4

我的舊應用程序寫入註冊表(最終被虛擬化),現在我希望安裝程序實際讀取這些數據,當我直接從LOCAL_MACHINE嘗試時(我不知道密鑰是虛擬化)我得到了錯誤,然後當我決定嘗試直接從虛擬化密鑰中讀取時,我也遇到了錯誤。從虛擬化Windows註冊表中讀取密鑰

Windows 2008服務器64位,我的應用程序是32位,啓用UAC。

那麼它實際上是否可以直接從虛擬化Windows註冊表讀取?

現在我需要讀取這些數據,但是。

這不起作用。

if regkeyexists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Company\App') then 
    begin 
    msgBox('Exists', mbinformation, mb_ok); 
    end else begin 
    msgBox('Doesnt exists', mbinformation, mb_ok); 
    end; 

而且這不起作用。

if regkeyexists(HKEY_CURRENT_USER, 'Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\Company\App') then 
    begin 
    msgBox('Exists', mbinformation, mb_ok); 
    end else begin 
    msgBox('Doesnt exists', mbinformation, mb_ok); 
    end; 

它說,關鍵不存在

所以現在我不能真正讀取數據? 我查過了,路徑還行。

+2

使用RegKeyExists(HKEY_LOCAL_MACHINE_32 ...'或RegKeyExists(HKLM32 ...)並從您的關鍵路徑中移除該'Wow6432Node'。在64位系統上使用來自'Wow6432Node'節點的根密鑰讀取。 – TLama

+0

我試過了,似乎還沒有工作仍然.. HKLM_32和HKLM有什麼區別?它直接指向Wow6432Node嗎? 由於我的應用程序是32位,當它寫入註冊表時,它實際上寫入這個節點(當我運行在一個64位系統,這是我現在正在做的),這就是爲什麼我試圖從那裏讀取。 –

+0

這個問題實際上是因爲Inno安裝程序以管理員權限運行,即使我的Windows用戶是管理員,如果使用「以管理員身份運行」執行我的應用程序,它就會被執行es正確地LOCAL_MACHINE ...並且如果我不,它不能讀取虛擬化的密鑰.. –

回答

2

我可以使用一些解決方法解決我的問題,所以只是爲了讓別人知道別人需要它的情況。

發生的事情是,即使是管理員用戶,在啓用了UAC的Windows 2008服務器中,我的應用程序(不是以管理員身份運行)用於在虛擬化密鑰中記錄其註冊表,而Inno安裝程序中的安裝可能會寫入到真正的LOCAL_MACHINE,使應用程序的註冊表對我的應用程序不可見,反之亦然。

由於我發佈了一個新版本,其中我必須確保應用程序註冊表位於LOCAL_MACHINE中,我使用'ShellExecAsOriginalUser'運行了一個獨立的應用程序,以實際將虛擬化密鑰導出到文件,然後導入回通過Inno Setup設置到LOCAL_MACHINE。

我很感謝所有的回答!

+1

這基本上與我使用相同的方法時,我必須這樣做。具有'runasoriginaluser'的非顯示應用程序從「原始」路徑讀取(由Windows進行虛擬化),然後移至管理員安裝程序設置的關聯位置。 – Deanna

+0

有趣的是。這些註冊表映射的Windows虛擬化有時會變得頭痛! –

+0

只有當你以錯誤的方式開始時:) – Deanna

3

虛擬化密鑰是每個用戶的數據;這意味着,即使您能夠成功從安裝程序中讀取一個,您也只能閱讀一個用戶的設置,而不是所有用戶的設置(並且正如您發現的那樣,您很可能無法閱讀那一個)。

通常情況下,您可以忽略虛擬化,直到升級應用程序並將其標記爲兼容性清單,此時它將失去虛擬化並且您必須正確處理註冊表。所以我假設這是你發現自己的情況。

在這種情況下,正確的分辨率不在安裝程序中,它在您的應用程序中。您的安裝程序應該根本不寫入註冊表,或者應該在HKLM中存儲只讀默認值。在啓動時,您的應用程序應首先嚐試按以下順序來讀取位置設置(僅向下移動列表中,如果它不能找到價值存在):

  1. HKCU \ SOFTWARE \ YourCompany \ YourApp \ SettingName
  2. 的在HKLM關鍵的VirtualStore位置,你被錯誤地使用以前
  3. 的HKLM關鍵可能是由安裝
  4. 一些內部默認值

當你的應用程序保存setti寫ngs,它只能寫#1,絕不會在其他地方寫。另外請注意,您必須按照這個列表中的每個設置 - 可能有一些設置在HKCU中,有些是虛擬化的,有些只在HKLM中。