调试COM免费注册(C++)

问题描述:

我已经构建了一个使用两个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

在为免注册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”,你应该把所有的系统都去掉。

是不被使用的简单解释.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