2009-11-20 51 views
9

我們使用清單文件來做免註冊COM,正如我在this other question中詳細闡述的那樣。如何在插件架構中免註冊COM

現在我們嘗試使用免註冊COM與支持插件的應用程序。插件是OCX文件,可在主應用程序已安裝後添加到主應用程序的文件夾中。

但是,這意味着主應用程序的清單文件需要由插件安裝程序進行修補。這似乎是一個危險且容易出錯的事情,特別是如果可以安裝多個插件的話。

有沒有辦法以某種方式拆分主應用程序的清單文件,以便每個插件可以安全地將它自己的部分添加爲單獨的文件?或者另一種安全的方式來修補清單文件?

如果相關:我們使用wix創建我們的安裝程序。

回答

6

我不建議修改應用程序的清單文件;這似乎相當脆弱,只有在生活在可寫的位置才能起作用。

在進程啓動時,應用程序的清單用於生成「激活上下文」,該進程作爲進程範圍的激活上下文進行推送。但是每個線程都有一個激活上下文堆棧,可以直接操作。在查找COM註冊數據時,給定線程上的操作既可以查看堆棧頂部的上下文,也可以查看進程範圍的激活上下文。

建議任何時候插件代碼需要調用COM,插件特定的清單應該在線程上激活。這可以很容易地通過以下兩種方式之一進行:

  1. 清單嵌入到插件與宏定義ISOLATION_AWARE_ENABLED編譯特定插件,表現爲一個ID2。這基本上包含需要清單上下文的常見Windows API,以自動激活和停用圍繞該調用的正確激活上下文。

  2. 激活/關閉線程周圍所有進入插件的線程上的正確激活上下文。這是通過activation context APIs完成的。這是最容易通過激活context management object完成的。

+0

+1有趣!看起來我有一些閱讀要做。 – 2009-12-01 11:26:13

+0

謝謝你,尤金。你知道任何使用至少一種解決方案的示例代碼嗎?謝謝。 – 2011-06-17 00:02:36

+1

我實際上是通過遵循這裏的指南得到這個工作的: http://www.mazecomputer.com/sxs/help/sxsapi3.htm 還有來自vvvsample的示例代碼: http://msf.codeplex.com /但我必須將COM DLL複製到與我試圖避免的exe相同的目錄中。 我目前正在將外部清單的完整路徑和測試目錄的完整路徑傳遞給CActCtxHandle.Create()(例如,分別爲「C:\ Rel \ MyCppTests.dll.manifest」和「C:\ Rel」 )。 COM DLL也駐留在「C:\ Rel」中,但exe駐留在不同的目錄中(例如「C:\ TestRunner」)。 任何想法? – 2011-06-17 04:53:53

4

如果您使用.NET中,可以使用這個答案顯示the code採取激活上下文的照顧。

+0

這工作得很好!謝謝,塞繆爾! :) – 2013-05-16 22:50:03