2010-10-19 141 views
10

我想安裝註冊免費的COM,但有一個小問題,我另一個COM對象可能是客戶端。註冊免費的COM和DLL清單

APP.EXE -----> COM服務器/客戶端DLL(註冊與否)--------> COM服務器DLL(未註冊)

我的問題是,是否有可能爲第二個DLL(COM服務器/客戶端DLL)創建一個清單?我沒有可執行文件的控制權,但是如果我這樣做了,如果我爲可執行文件創建客戶端清單併爲COM服務器dll創建服務器清單,則這將起作用。

這是中間dll的清單文件。我試圖嵌入它並嘗試外部。仍然不起作用。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity type="win32" 
        name="COMCliSer.dll" 
        version="1.0.0.0" 
    /> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
        name="COMSer.dll" 
        version="1.0.0.0"      
     /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

在進一步的調查,我可以得到這一切工作,只要中間的DLL也是免費註冊和exe有一個應用程序清單。只要我註冊中間的DLL,並放棄應用程序清單(我沒有控制什麼exe將使用我的DLL),整個事情停止工作。

如果exe沒有清單,那麼dll的清單就沒有考慮在內。我可以通過設置一切工作來證明這一點。然後在程序集清單中輸入一個錯誤。該彈出通常的消息:

無法創建過程:此應用程序無法啓動,因爲應用程序配置不正確。重新安裝該應用程序可能會解決此問題。

如果我然後刪除應用程序清單,應用程序加載(儘管是CoCreateInstance的失敗,因爲它的依賴不會考慮)

+0

爲什麼你叫裝配'comser.dll'?程序集清單信息是否合併?使用描述性名稱部署程序集要容易得多,例如「Microsoft.VC90.CRT」,包含不同名稱的dll:「msvcr90.dll」。在處理dll程序集時,由於單個清單現在有兩個用途:調用程序集的內容給用戶,以及描述程序集中dll的依賴關係,因此調試變得更加困難。 – 2010-10-20 12:41:24

+0

這些名字已經改變,以保護無辜!那些不是真名。這些是本機COM dll而不是.NET程序集。 – Steve 2010-10-20 13:31:30

+0

另外,「不起作用」算作什麼?是否exe和第二個DLL加載,並簡單地未能實例化第三,或exe的,或第二個DLL無法完全加載?讓事情實際上無法加載是一個好的步驟,因爲它意味着系統正在查看清單,並至少將錯誤記錄到系統或應用程序事件日誌中。如果它簡單地失敗了對CoCreateInstance的調用,那麼它可能根本看不到該清單。 – 2010-10-20 15:57:52

回答

5

只需添加一個組件依賴於客戶端/服務器DLL的清單指向com服務器DLL。

請記住,程序集清單與「應用程序」清單不同:程序集清單描述程序集:給它一個名稱,並列出它的dll。 應用程序清單是RT_MANIFEST嵌入式資源,它描述了當前模塊的依賴關係。

所以,說到底,你會:

  • APP.EXE,與外部(app.exe.manifest)或描述在組裝的依賴嵌入式RT_MANIFEST稱爲「acme.clientserver」
  • acme.clientserver.manifest描述一個程序集,並將'clisrv.dll'列爲註冊免費的com dll。
  • clisrv.dll,與外部(clisrv.dll.2.manifest)或嵌入RT_MANIFEST,描述上稱爲 'acme.server'
  • acme.server.manifest的組件的依賴性,描述一個組件,列出SERV .dll作爲註冊免費的COM DLL。
  • serv.dll - 可能或者可能不會有一個清單列出更多的依賴程序集。

這在技術上是可以調用的DLL名稱的裝配,併合並雙方的裝配和DLL體現一起 - Win32加載器支持這一點,但一些設置,在應用程序清單是有效的不是裝配清單有效,這可能導致生成的程序集無法加載。這也使數字簽名非常困難。


WRT exe必須有一個清單:通常exe的清單設置進程默認激活上下文。我不能100%確定當exe沒有清單時windows如何運行,但我很確定dll中的清單仍然會被處理。

這意味着問題歸結爲CoCreateInstance中缺少隔離支持 - 出於某種原因 - 默認情況下 - CoCreateInstance僅在reg free com條目的默認激活上下文中查找。

重寫它是手動建立自己的激活上下文,使用Activation Context API

的基本方法是調用方式:

  • CreateActCtx - 創建一個從您的dll文件清單的激活上下文。
  • ActivateActCtx - 激活上下文
  • CoCreateInstance - 現在將搜索reg free com條目的當前激活上下文。
  • DeactivateActCtx - 恢復默認激活上下文。

您可以添加/ d ISOLATION_AWARE_ENABLED包裝由活化的上下文實現的,由於某種原因,CoCreateInstance的大多數Windows調用不裹:/

+0

我沒有app.exe.manifest(不需要它,因爲中間的COM DLL已註冊)。我試圖給中間的dll添加一個清單,但無濟於事。 – Steve 2010-10-20 10:34:34

+0

你是否在資源編輯器(例如visual studio)中打開了中間的dll文件,看看它是否具有RT_MANIFEST資源以及它的內容? VS始終將RT_MANIFESTS顯示爲十六進制,因此您需要將其導出爲將其作爲文本進行查看。 – 2010-10-20 10:37:02

+0

好的,那樣做。該DLL有兩個RT_Manifest,我想是由編譯器(Delphi)將Windows公共控件命名爲依賴關係,另一個是我添加的上面顯示的那個。 – Steve 2010-10-20 11:05:48