2010-07-14 42 views
2

我的MSI安裝程序不會在XP上註冊DLL。在Vista上它不會註冊,除非我是管理員。並在Win7上隨機註冊該DLL或不。MSI Desparation。 MSI不會註冊DLL

MSI不會註冊該DLL之後,用戶被迫去安裝文件夾,輸入「regsvr32 mydllname.dll」 - 然後一切正常(證明該DLL是健康的和良好的)。

該文件的「register」屬性是MSI項目中的「selfReg」。 「COM」不起作用。

我開始想我是幻覺或MSI根本無法註冊DLL ....非常,非常非常沮喪。已經是一個周試圖解決這個問題和NADA。我真的很討厭MS。

請幫助。

回答

3

最可能發生的事情是,您的註冊代碼正在寫入錯誤的註冊表根目錄。例如,HKCRHKLM\ClassesHKCU\Classes的合併視圖,在某些情況下,註冊到HKCR最終將在HKCU\Classes中,有時在HKCU\Classes\VirtualStore中取決於安裝程序在哪個操作系統和哪個帳戶下運行。另外,如果您要依靠DllRegisterServer註冊您的MSI的COM DLL,MSI引擎甚至不知道您的註冊表項,它取決於實際的DLL代碼。

我建議將您的MSI更改爲不使用使用DllRegisterServer的自動註冊,而不使用HKCR的註冊。相反,將您的註冊添加爲HKLM\Classes下的顯式註冊表項(除非您有特定的理由要求每個用戶的COM註冊,這是一個完全不同的主題)。

0

是的,Franci Penov的一個很好的答案。 作爲一個選項,你也可以嘗試加入

regsvr32 yourdll.dll 

上installexecute序列的自定義操作文件部署後的同一個去除,但與/ u鍵在HKCR註銷

0

註冊(及相關映射蕁麻疹)需要管理員權限,並始終如此。這基本上與「我可以寫入XP中的程序文​​件目錄但不在Vista中」相同。這是因爲每個人都是XP上的管理員,但是由於UAC沒有人是管理員,除非他們以某種方式提升(以管理員身份運行,而另一個是UAC提升提示)。自我註冊

的常見原因在安裝時失敗是:

  1. 海拔不足(如每個用戶安裝從未顯示UAC提升對話框)。

  2. 缺少依賴關係。可能有一個你依賴的Dll,它不在目標系統上。如果註冊在安裝完成後生效,則可能依賴於Win32或託管代碼程序集。如果您對WinSxS的C++運行時有依賴關係,並將其作爲合併模塊包含在內,那麼只有在安裝完成並且註冊失敗後纔會提交。進入GAC的程序集也是如此,但在您的Win32註冊案例中似乎不太可能。如果它在Windows 7上是隨機的,那通常是因爲一些系統已經安裝了C++運行時,而另一些則沒有。

這些天來的大多數工具,包括Visual Studio和WiX,都可以在構建時提取COM註冊。它是靜態數據,所以沒有理由不能在MSI文件中。在WiX的情況下,該工具被稱爲Heat。這也意味着無需在安裝時調用Dll,避免依賴性問題。 vsdraCOM的設置可以做到這一點,我已經成功地使用了它,但是就像每次註冊一樣,它需要依賴的Dll在構建時可用。沒有好的方法來看它是否有效,但是如果你得到一個MSI編輯器(比如Windows SDK中的Orca)並打開MSI文件,你應該可以在Class表中看到你的類,並且會有一些東西註冊表表。

如果您有更多關於「實際上不會註冊」的詳細信息,它也可能有所幫助。在安裝時是否缺少接口條目,CLSID條目,錯誤消息,由於無法實例化類而無法運行的應用程序?