2010-03-21 13 views
5

我對WiX比較陌生。這是一個很棒的工具,但我仍然需要一些時間來更好地學習它。 我遇到註冊和註銷COM 組件的問題。我爲兩個應用程序創建了安裝程序,我們稱它們爲A 和B.兩者都使用相同的COM組件。我已經使用了加熱工具,建議使用 。安裝A或B時,組件註冊時沒有任何 問題。WIX:COM在取消兩個程序中的一個時取消註冊

但是,當我安裝A和B,然後刪除A(與添加/刪除程序)的COM 類獲取未註冊和B不能再使用它。有沒有一個乾淨的 解決方案來防止這種情況發生?當B和A都被卸載時,我想取消註冊COM 。

任何幫助,將不勝感激,

最好的問候, madbadger

編輯:感謝您的答覆。我在兩個安裝程序中將GUID設置爲相同的值,現在正在正確刪除註冊表項,即從系統中刪除最後一個程序。
Hovewer,問題仍然存在的原因之一。我已經在HKEY_CLASSES_ROOT/CLSID/[適當的COM GUID]下檢查了註冊表。這是發生了什麼:
- 我安裝A和COM的路徑設置爲[路徑到A/component.dll]
- 我安裝B和COM的路徑設置爲[路徑B/component.dll ]
- 我刪除B和COM的路徑仍然[B/component.dll的路徑]
- 現在由於[B/component.dll的路徑]不存在,A不能通過註冊COM組件不再

現在我認爲必須將COM組件放在兩個應用程序的相同目錄中。 Windows Installer無法恢復到舊路徑,還是我缺少的東西?

回答

4

Windows安裝程序會爲你做這個,但前提是你的COM組件已經跨越既有相同的GUID和B,(和DLL的安裝在這兩個應用程序在同一個地方。)

Windows安裝程序通過引用計算每個組件(在整個系統中)進行工作。組件通過它們的GUID進行標識。

如果COM組件具有相同的GUID,會發生什麼情況是這樣的:

  • 安裝:組件的refcount推移從0-> 1,窗戶安裝其登記
  • 安裝B:成分的refcount從變1-> 2,沒有任何反應
  • 卸載:組件的refcount推移從2-> 1,沒有任何反應
  • 卸載B:成分的refcount推移從1-> 0,窗戶安裝註銷它

如果它不具有相同的GUID,會發生什麼情況是這樣的

  • 安裝:組件引用計數變爲從0-> 1,Windows安裝程序將其註冊
  • 安裝B:B組份引用次數變從0-> 1,Windows安裝程序註冊它,覆蓋組件A的註冊表項。
  • 卸載A:組件A refcount從1-> 0,Windows安裝程序取消註冊它,刪除註冊表項。
    - 看來好像這是你在
  • 卸載乙是這種情況:B組份引用次數變爲由1-> 0時,Windows安裝程序取消註冊,刪除註冊表項(但他們已經被刪除)

編輯隆起的評論:

還有GUID,每個組件也有一個 「關鍵路徑」。如果組件包含一個或多個文件,則應使用KeyPath="foo.dll"來設置哪個文件是「密鑰」文件。如果組件包含一個或多個註冊表項,則它是相似的。

當檢查是否安裝了某些東西時,Windows安裝程序將檢查GUID,讀取關鍵路徑,然後檢查關鍵路徑中的文件(這是如何計算出版本的東西等等),所以如果兩個組件具有相同的GUID,則它們的必須也具有相同的鍵路徑,這些必須在安裝產品時解析到文件系統中的相同位置。

這是一種說明安裝程序必須將共享文件放在同一位置的方法。至於在哪裏放置它們,System32不是一個好地方。

我建議在common文件夾下的某個地方(通常是Program Files\Common Files\YourCompanyName)。你可以這樣輸入Wix:Directory="[CommonFilesFolder]\YourCompanyName"

+0

我應該把COM組件放在兩個安裝程序的一個位置嗎? system32文件夾是否適合它? – madbadger 2010-03-22 01:52:59

+0

是的,你必須把它放在同一個位置。(Windows安裝程序標識GUID和文件/註冊表路徑)。 System32不是一個好地方。我會建議在普通文件文件夾下的某個地方(通常是「Program Files \ Common Files \ YourCompanyName」)。你可以這樣輸入Wix:'Directory =「[CommonFilesFolder] \ YourCompanyName」' – 2010-03-22 03:26:19

+0

非常感謝你對此的深入解釋! – madbadger 2010-03-22 12:47:53

1

在你的Component標籤中,你是否在每個安裝程序中使用相同的Guid?

0

你應該將這個公共組件包裝在合併模塊中,並從兩個應用程序中引用它。

這將自動讓共享dll refcounting在卸載時完成其工作。