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

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

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

我相信问题是COM +不能执行编组,因为没有types库 – 它不知道该怎么做。 我是否需要生成并注册一个types库来解决这个问题,或者还有其他方法吗?

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

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

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

(为了记录,我已经离开了ATL / COM编程,转而使用Java,所以虽然我可以让你知道我过去记得的事情,但现在我不使用这些工具,而且我也很难找回进入他们提供更多的帮助,但microsoft.public.vc.atl的人很聪明。)

Typelib是支持编组的一种方式,代理/存根DLL(来自IDL的生成)是另一种方式。 不过,在这两种情况下,首先你需要IDL。

如果微软没有为这个接口提供一个typelib / proxy DLL或者IDL,可能性是这样的:原因可能是接口使用了非可编组的数据结构,需要将函数指针作为方法参数传递,还是像这样? 如果是这种情况,那么就没有办法让这个接口为DCOM工作。

也许你可以重建IDL,但很可能,这是不可行的。 那么你最后的回退可能是使用自定义或处理程序编组,但这可能是不值得的努力。 也就是说,我建议考虑其他不涉及使用DCOM接口的路由,而这些路由并不是用于DCOM的。

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

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

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

如果这些条件不符合,界面将不会被编组。