2011-02-16 103 views
7

我已經構建了一個使用兩個COM服務器DLL的COM客戶端應用程序;我想這個應用程序運行時沒有COM註冊 - 即:winsxs/.manifests調試COM免費註冊(C++)

我得到(...幾乎預期...)「類未註冊」消息,當我嘗試創建我的COM對象的實例從我的客戶應用程序。

我已經成功的那種配置之前,但我不明白爲什麼這一次失敗。


這裏有一些更多的細節:

  • 模塊我有:
    • 一個MFC客戶端,取決於2個COM服務器(dll1.dll和dll2.dll)
    • dll1.dll COM服務器依賴於dll2.dll
    • dll2.dll沒有COM依賴項

COM對象,我有:

  • 在dll1.dll(的.idl語言)

- 在DLL 2

  • -

    [ 
        object, 
        uuid(262D00FB-3B9F-4A76-98FC-3051FDCAF0A6), 
        dual, 
        nonextensible, 
        helpstring("IDialogManager Interface"), 
        pointer_default(unique) 
    ] 
    interface IDialogManager : IDispatch{ 
    }; 
    [ 
         uuid(58562535-BCA5-4D04-BB92-78F90EDA201E), 
         //... 
    ] 
    dispinterface _IDialogManagerEvents 
    { 
    }; 
    [ 
         uuid(D599D3F0-A4D1-44A7-87A9-16032CC613CA), 
         //... 
    ] 
    coclass DialogManager 
    { 
         [default] interface IDialogManager; 
         [default, source] dispinterface _IDialogManagerEvents; 
    }; 
    

    。 dll

-

[ 
    object, 
    uuid(2A183A2E-A620-4E00-B657-C9D2E59201D4), 
    nonextensible, 
    helpstring("ICadWizardsManager Interface"), 
    pointer_default(unique) 
] 
interface ICadWizardsManager : IDispatch{ 
}; 
[ 
    object, 
    uuid(FE97F3FB-8930-43BC-947D-64C90F45A071), 
    nonextensible, 
    helpstring("ICadWizard Interface"), 
    pointer_default(unique) 
] 
interface ICadWizard : IDispatch{ 
}; 
[ 
    uuid(5365D4E6-ADFB-4429-9DEA-C44CC94AA3EF), 
] 
dispinterface _ICadWizardEvents 
{ 
}; 
[ 
    uuid(CAC2D0BF-AD5B-4CC8-A04D-53AB23A0CDF4), 
] 
coclass CadWizard 
{ 
    [default] interface ICadWizard; 
    [default, source] dispinterface _ICadWizardEvents; 
}; 
[ 
    uuid(3164FAC4-6F5F-4E4D-9B09-DC4115850D78), 
] 
dispinterface _ICadWizardsManagerEvents 
{ 
}; 
[ 
    uuid(707CB6C8-311E-45EC-9DCB-50477F588BAF), 
] 
coclass CadWizardsManager 
{ 
    [default] interface ICadWizardsManager; 
    [default, source] dispinterface _ICadWizardsManagerEvents; 
}; 

-

  • 客戶端調用

-

IDialogManagerPtr dialogManager; 
dialogManager.CreateInstance(CLSID_DialogManager); // <<< returns "Class not registered" 

-

  • 的client.exe.2.manifest

-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 

<assemblyIdentity name="client" version="1.0.0.0" type="win32" processorArchitecture="x86"/> 
<file name="dll2.dll"> 
<comClass 
    clsid="{707CB6C8-311E-45EC-9DCB-50477F588BAF}" 
    threadingModel="apartment"> 
</comClass> 
<comClass 
    clsid="{CAC2D0BF-AD5B-4CC8-A04D-53AB23A0CDF4}" 
    threadingModel="apartment"> 
</comClass> 
</file> 

<file name="dll1.dll"> 
<comClass 
    clsid="{D599D3F0-A4D1-44A7-87A9-16032CC613CA}" 
    threadingModel="apartment"> 
</comClass> 
</file> 

</assembly> 

-


我的SxS激活上下文生成過程中沒有錯誤: - 中沒有錯誤窗口日誌(應該意味着我的清單語法是正確的) - 沒有檢測到錯誤sxstrace(日誌以「INFO:激活上下文生成成功結束。「消息,不包含錯誤或sucpicious消息;此外,我看到我的表現是否正確裝入)

任何想法

有沒有辦法來調試的SxS更深,隨着sxstrace獲得的實際註冊名單? COM或提前

+0

你在實現雙接口嗎? – wqw

+0

我編輯了我的帖子,添加IDialogManager,ICadWizardsManager和ICadWizard的完整idl定義;這是我實現 – loic

回答

2

在爲免註冊COM構建激活上下文時,通常會涉及至少兩個清單。

有EXE清單,指定它的相關程序集,包括包含COM組件的程序集,還有程序集清單,它描述程序集中的dll,窗口類和COM對象。

This Blog包含有關.2的含義的信息。基本上,當系統查找清單時,它會查找modulename.exe [.resid] .manifest - 在resid爲1的情況下,它將被省略。

因此,您使用的是MFC,意思是DevStudio,這意味着您的項目應該已經配置爲自動生成一個RT_MANIFEST資源,其中包含c運行時和通用控件6設置。

Visual Studio 2005支持這種語法合併與您的應用程序清單dependentAssembly元素,而無需直接嘗試和合並XML:

#pragma comment(linker, \ 
    "\"/manifestdependency:type='Win32' "\ 
    "name='client' "\ 
    "version='1.0.0.0' "\ 
    "processorArchitecture='*' "\ 
    "language='*'\"") 

所以,如果添加到CPP或頭在您的.exe,然後將你的client.exe.2.manifest保存爲「client.manifest」,你應該把所有的系統都去掉。

6

是不被使用的簡單解釋.manifest的文件CLR類例如???

謝謝。這是在這種情況下非常有可能,您的.exe幾乎當然已經包含一個作爲資源嵌入的清單。 MFC應用程序非常適用於啓用視覺樣式。對於由嵌入清單來查找運行時DLL的VS2005或2008編譯器編譯的代碼。

要驗證這一點,請使用File + Open + File並選擇編譯後的.exe文件。尋找RT_MANIFEST節點。如果Windows找到這樣的嵌入式清單,它將不會繼續尋找基於文件的清單。您需要將您的regfree COM條目合併到嵌入式條目中。我希望我能給你一個很好的MSDN Library鏈接,但關於清單的文檔吸引嚴重的搖滾樂。

+3

+1的接口,以獲得有用的答案;我會給+10「關於清單的文檔吸嚴重的搖滾」:-) –

+0

即使sxstrace記錄我的清單已被正確解析,這是否有效? – loic

+0

在我看來,sxstrace清楚地表明清單實際上被使用了。據我瞭解,當我監視應用程序加載(procmon)看來,Windows查找client.exe.manifest __如果沒有RT_MANIFEST res__;否則,它會查找client.exe.2.manifest。因此,在我看來,即使嵌入式清單存在,也使用「外部」清單 – loic