启用COM接口编组需要什么?

时间:2009-05-12 12:25:37

标签: windows com interop marshalling atl

我有一个没有类型库的32位ATL COM组件。它有一个类工厂,用于实现多个接口的给定类。

当我将它用作进程内服务器时,一切正常 - 客户端调用CoCreateInstance(),对象被实例化,QueryInterface()检索指向所请求接口的指针。但是,当我将组件放入COM +时,我不再可以实例化该类 - CoCreateInstance()现在返回E_NOINTERFACE。

我认为问题是COM +由于缺少类型库而无法执行编组 - 它不知道如何做到这一点。我是否需要生成并注册类型库以解决此问题,还是有其他方法吗?

3 个答案:

答案 0 :(得分:2)

Typelibs是支持编组的一种方式,代理/存根DLL(从IDL生成)是另一种。但是,在这两种情况下,您首先需要IDL。

如果Microsoft没有为此接口提供类型库/代理DLL或IDL,则可能存在这样的原因:可能接口使用非可编组数据结构,需要将函数指针作为方法参数或事物传递像这样?如果是这种情况,则无法使此接口适用于DCOM。

也许你可以重建IDL,但很可能,它只是不可行。然后你的最后一个后备可能是使用自定义或处理程序编组,但这可能不值得努力。也就是说,我建议考虑不使用DCOM接口的其他路由,这些接口不是用于DCOM的。

答案 1 :(得分:1)

的Urk。我建议在microsoft.public.vc.atl询问,因为我认为你会在那里找到更多的专家。我认为(虽然我不是专家)这个问题与COM +关系不如注册代理/存根问题。 (换句话说,即使您编写了自己的COM客户端来访问进程外的组件,您可能会遇到同样的问题)如果您有标准的自动化兼容接口,那么Windows知道如何编组对象只是精细。但除此之外它很混乱。

如果没有类型库,您需要注册代理/存根,或者需要自己实施IMarshal来处理自定义编组。 (或者还有这个“处理程序编组”的东西,我不明白)

您对没有类型库的原因的评论(实现已经由Microsoft定义的接口,但没有类型库的接口)会引发一个红色标记。你能提供更多细节吗?如果它是.DLL或.EXE中的内容,但类型信息在库本身(而不是外部.TLB文件)中,则可能提取正确的信息以使一切正常工作,我只是不熟悉处理。

(为了记录,我已经离开了ATL / COM编程,支持Java,所以虽然我可以让你知道我过去记得的东西,但我现在不使用这些工具,对我来说很难回到它们中以提供更多帮助。但microsoft.public.vc.atl上的人非常聪明。)

答案 2 :(得分:1)

对于使用Microsoft的默认编组器进行编组的COM接口,接口必须在其标头中定义DUAL或OLEAUTOMATION属性。

如果定义的方法的参数是接口指针,则相同的要求将扩展到这些接口。

此外,接口名称必须存在于定义它的IDL的LIBRARY部分中。这也扩展到其他引用的接口。

如果不满足这些条件,则界面将无法编组。