2011-06-20 27 views
1

我有一段現已運行良好的現有ActiveX/COM組件。此ActiveX組件最初設計爲供每臺機器上的一個客戶端應用程序使用。但是,現在需要擴展該ActiveX組件以供同一臺PC中的多個客戶端應用程序使用。註冊並使用用IDL創建的ActiveX/COM組件以及運行時生成的UUID

我知道爲什麼COM就位的原因是可重用性,並且有辦法管理這個,比如引用計數等等。但是我的問題是不同的。請繼續閱讀...

每個客戶端應用程序如果不同,並且這些客戶端應用程序充當獨立應用程序 - 就像它們作爲單獨應用程序一樣安裝和卸載。他們每個都攜帶這個ActiveX組件的副本,並將其安裝在它自己的安裝目錄中。每個客戶端應用程序都有它自己的這個ActiveX組件的副本,它安裝,使用和卸載。

下面給出了基本發生的步驟。步驟4以下是實際的問題:

  1. 我第一次安裝一個客戶端應用程序X,因爲它使用COM,則安裝程序將註冊COM組件,這將創建一個條目在註冊表中與「類型庫」條目在IDL和.rgs中定義的UUID。

  2. 如果我安裝另一個客戶端應用程序Y,在卸載客戶端應用程序X之前,Y的安裝程序使用Y當前目錄中的ActiveX組件的路徑更新「typelib」的「win32」值。

  3. 當我卸載客戶端應用程序X時,它從註冊表中刪除此typelib條目。

  4. 所以在這一點上,如果我嘗試卸載應用程序Y,它失敗,因爲typelib條目丟失。 X的卸載程序已經刪除了這個條目。

要解決此問題,我試圖繞過使用類型庫或使用替代方法(如果可能)使用ActiveX組件,而不存在我現在面臨的問題。

問題歸結於此 - 爲不同的客戶端應用程序提供不同的類型庫條目,但針對相同的ActiveX組件。

有人可以指導我,並建議一個很好的,優雅的解決方案?

+0

一種解決方案可能是使用免註冊的COM:http://msdn.microsoft.com/en-us/library/ms973913.aspx – Paolo

+0

@Paolo:謝謝!這當然是我現在正在努力的一個選擇。任何關於如何去做的指針? – aeon

回答

-1

我已通過修改rgs文件創建IDL來解決此問題。

相關問題