2012-06-19 89 views
3

現狀:有沒有辦法讓DLL註冊到HKLM?

我創建了C#DLL中使用COM運行Process.Start通過Web瀏覽器來運行程序。我使用VS2010的內置部署項目創建了一個MSI。我爲這個DLL中的對象指定Guid屬性,但我從不指定位置。當我運行MSI並選擇安裝「Just Me」時,按預期在HKCU(current_user)中創建註冊表項。我需要它爲所有用戶運行,所以當我運行MSI並選擇爲「Everyone」安裝時,註冊表項也在HKLM(local_machine)中創建,也如預期。無論哪種方式,一旦MSI安裝DLL,使用DLL的Intranet Web應用程序對於我來說就分別適用於管理員(current_user)和所有用戶(local_machine)。

但是,在我公司的主要IT部門內部,我們無法創建自己的MSI。我們必須將請求和我們的DLL/TLB文件發送給某個人,他們的唯一職能是爲供應商/內部開發人員創建MSI。當我手動運行他的MSI,並選擇安裝「Everyone」時,它再次按預期工作。

的問題

微星,但是,需要儘可能部署的軟件自動運行,而當這種情況發生時,註冊表項中HKEY_CURRENT_USER,才能創建,所以當測試用戶嘗試,他們都沒有發現使用該功能。他說,ALLUSERS屬性設置爲1,所以這應該工作。此外,當我讓他將它們安裝到適當的位置(local_machine)時,他堅持要我在我的DLL中進行這些更改,因爲「MSI文件不會創建註冊表項,它是在DLL期間安裝「。從我在網上閱讀的各種文章中,MSI通常會指定,其中在註冊表中這些密鑰已創建。

的問題(也可用於TL; DR):

是否有任何真理他的說法,我需要在我的DLL指定註冊表中的位置?如果是這樣,我怎樣才能以編程方式指定這些密鑰默認爲HKLM?現在,我所做的只是指定ComVisible,ClassInterface,Guid,ProgId和ComDefaultInterface ...我從未指定位置,MSI中的「Everyone/Just Me」除外。我對COM對象比較陌生,並且在註冊表中對我自己的創作進行了混亂,所以我不想跳下他的嗓子說我不能做他應該做的事情。

謝謝!

+0

這通常對本地COM組件真實的,不是管理的。安裝程序編寫者通常使用Heat.exe收集註冊表項並且不會將其留給組件。問他用一個.reg文件可以做什麼,用Regasm.exe/reg選項生成一個。還有[ComRegisterFunction],作爲最後的手段使用。 –

回答

2

如果我正確地理解你的問題,你的意思是:

  • 你不能使用你自己的MSI部署你的網絡內部的DLL,
  • 您對自己的IT部門是包裝的方式無法控制在他們提供的MSI,
  • 部署您的DLL你希望它是註冊DLL工作完全一樣,你的方式。

在這種情況下,我會建議創建一個合併模塊(MSM)而不是安裝包(MSI)。將所有設置邏輯(文件,註冊表項,自定義操作等)放入合併模塊中。

然後寫周圍的合併模塊的簡單MSI外殼供自己使用,並提供合併模塊到您的IT部門,要求他們將其整合到自己的安裝包的構建過程。

+0

你的項目符號是點亮的,所以+1和你的建議。我會給合併模塊一個鏡頭,讓你知道它是如何去。 – rownage

+0

我得到了它在我自己的MSI建造工作,並提交必要的東西其他的「MSI生成器」。無論他如何處理它,它都適用於我,所以我會將其標記爲已接受。再次感謝! – rownage

1

這個叫做「regsvr.exe」的工具。它在System32中,你應該可以在命令行上用「regsvr」來調用它。因此,調用如下:

prompt> regsvr [dllname] 

其中[dllname]是DLL文件的名稱(如果它在當前目錄中,它的名稱相對較好)。

在Windows Vista和7上,必須使用管理權限明確運行此命令(即,您必須運行具有管理權限的cmd.exe),僅僅作爲管理員是不夠的。

要使用管理員權限運行命令提示符,請打開啓動欄,在搜索字段中鍵入「cmd」,然後使用[CTRL] [SHIFT] [ENTER]啓動,並接受UAC提示符(如果出現)。 (您可以用這種方式以管理員身份運行任何程序。)

相關問題