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

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

我认为问题是,COM +不能执行,因为没有类型库的编组 - 它不知道该怎么做。我需要生成和注册类型库来解决这个或有任何其他方式?

有帮助吗?

解决方案

的Urk。我建议,要求在 microsoft.public.vc.atl 我想你会发现更多的专家那里。我认为(虽然我不是专家)的问题已经少做比注册代理/存根问题COM +。 (换句话说,即使你写自己的COM客户端来访问您的组件外的过程中,你可能会遇到同样的问题)如果您有标准的自动化兼容的接口,那么Windows知道如何做到这列你的对象精细。但否则被混淆。

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

您为什么你没有一个类型库(已实现由微软定义的接口,但一个不具有类型库)提出了一个红旗我评论。你能否提供更多细节?如果它的东西,在一个.DLL或.EXE,但类型信息库本身(而不是外部.TLB文件)内,它可能可以提取正确的信息,使一切工作,我只是不熟悉的处理。

(根据记录,我已经离开ATL / COM编程支持的Java,所以虽然我可以让你知道什么,我记得在过去,我现在不使用的工具,它会为我很难重新进入他们提供更多的帮助。但在microsoft.public.vc.atl的人是非常聪明的。)

其他提示

TYPELIBS是支持编组,代理/存根的DLL(从IDL genereated)是另一种方式。在这两种情况下,但是,你需要的IDL摆在首位。

如果Microsoft不提供这种接口类型库/代理DLL或IDL,赔率是,有一个原因:也许接口使用非marshalable数据结构,需要函数指针作为方法参数或事物要传递像这样?如果是这样的话,就是没有办法作出DCOM这个接口的工作。

也许你可以重建IDL,但很可能,它只是将是不可行的。然后你最后的回退可以使用自定义或处理编组,但这可能是不值得的努力。这就是说,我建议你考虑不使用的计划不是用于DCOM的DCOM接口,涉及到其他航线。

有关的COM接口使用微软的默认编组是marshallable,该接口必须具有无论是DUAL或属性了oleautomation在其报头中定义

如果有对于那些接口指针定义的方法参数,同样的要求延伸到这些接口。

加上接口名称必须是存在于IDL的定义它库部分。这还延伸至其它引用的接口。

如果这些条件不能满足,接口将不marshallable。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top