4

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

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

我认为问题在于 COM+ 由于缺少类型库而无法执行封送处理——它不知道该怎么做。我需要生成并注册一个类型库来解决这个问题还是有其他方法?

4

3 回答 3

2

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

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

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

于 2009-05-12T13:36:56.097 回答
2

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

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

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

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

于 2016-07-08T12:06:15.553 回答
1

乌尔克。我建议您在microsoft.public.vc.atl上询问,因为我认为您会在那里找到更多专家。我认为(尽管我不是专家)这个问题与 COM+ 的关系比注册代理/存根的问题要少。(换句话说,即使您编写了自己的 COM 客户端以在进程外访问您的组件,您也可能会遇到同样的问题)如果您有标准的自动化兼容接口,那么 Windows 就知道如何编组您的对象美好的。但否则它是混乱的。

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

您对为什么没有类型库(实现了微软已经定义的接口,但没有类型库的接口)的评论引起了我的注意。你能提供更多细节吗?如果它在 .DLL 或 .EXE 中,但类型信息在库本身内部(而不是外部 .TLB 文件),则可能提取正确的信息以使一切正常,我只是不熟悉过程。

(作为记录,我已经放弃了 ATL/COM 编程,转而使用 Java,所以虽然我可以让你知道我过去记得的东西,但我现在不使用这些工具,我很难再回来了进入他们以提供更多帮助。但是 microsoft.public.vc.atl 上的人非常聪明。)

于 2009-05-12T13:36:03.523 回答