QueryInterface XXXX failed when loading Enterprise Serviced Components

原创 2004年06月24日 00:01:00

COM+ 1.5可以说是Indigo到来之前的暂时替代产品,COM+ Service基本上也都是Unmanaged Code,就像MSDN Magazine里面的一篇文章说的那样,COM+是:

complex architecture where there are numerous places where the managed code interacts with unmanaged code - some documented, others undocumented.

问题的症状是这样的:装载一个继承自定义接口的、Server方式激活的COM+ 组件时抛出这样的异常,或者提示“XXX接口没有实现”。

可以说COM+里面80%莫名其妙的错误都是和COM InterOp有关,这个问题也不例外。如果把组件的激活方式改成Library就一切正常了,原因就在于进程内Enterprise Component使用Managed C++ Assembly直接调用COM+ API,而进程外的Enterprise Component则是使用RCW (Runtime Call Wrapper)来实现同COM+ API的Interop,问题也就出在InterOp上面。

首先一个问题,COM+ Component是可能被Unmanaged Client调用的,为了支持这种调用,我们通过指定[ClassInterface(ClassInterfaceType.AutoDispatch)],生成支持IDispath的Class Interface,这样做虽然无法支持Early Binding,但是能很好地避免因为Interface方法删改之后改变了Layout而导致Unmanaged Client无法正常工作。关于这方面的更多信息可以参考.NET Framework Document里面的Introducing to the Class Interface主题。

其次,为了保证继承的自定义接口是可以正常导出(tlbexp.exe)的,还需要指定接口生成的Class Interface的方式,缺省是生成Dual Interface,但为了和COM+ Component的接口生成方式相适应,还需要加上[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)],告诉tlbexp.exe这个接口将以IDispatch的方式生成。

代码看起来像这样:

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public intface IFoo
{
           void foo();
}

[ClassInterface(ClassInterfaceType.AutoDispatch)]
[Transaction(TransactionOption.Required)]
public FooCOM : ServicedComponent, IFoo
{
            ..............
}

通过这样的设定,基本上解决了这个问题。

QueryInterface的本质初探

转载请注明出处,版权归作者所有  lyzaily@126.com yanzhong.lee    本文写给COM的初学者! QueryInterface接口对CO...
  • liujiayu2
  • liujiayu2
  • 2015年04月16日 18:27
  • 322

weblogic上部署CXF系统问题服务端

环境:Weblogic 11g
  • tomatulip
  • tomatulip
  • 2014年08月26日 16:06
  • 1396

COM编程中的接口查询QueryInterface的实现原理

我们都知道,COM组件编程中,QueryInterface实现的接口之间的查询,通过这个接口,我们可以获取该组件中其他的接口。但是,QueryInterface实现的原理是什么呢,首先,我们看一下基本...
  • Andeewu
  • Andeewu
  • 2013年03月31日 17:12
  • 1535

【Android开发细节】之【@id与@+id区别】

Android的Layout布局文件中@id与@+id的区别,@id通常用于引用另一个控件,@+id用于创建一个控件的id值,不过不仅仅用于创建一个控件的id值,我来告诉你还能干什么。...
  • MicroAnswer
  • MicroAnswer
  • 2016年06月10日 22:56
  • 640

C++ 编程之QueryInterface函数(一)

前言 组件对外公布的是接口;一个组件可以实现多个接口,也就是说可以对外公布多个接口,之前也总结过了,你很少会100%的去完全了解一个组件的所有接口,就像你去学习编程一样,你几乎不可能去成为编程中...
  • sinat_32596537
  • sinat_32596537
  • 2016年12月14日 23:15
  • 204

如何在mac安装Tamarin开发unity3d(官方)

其实mlnodevelop轻便,是第一选择,但是安装后却跑不起来,网上的方法都试过了,无奈 公司的iMac可以,但是我自己的mac pro却不行,5.33盒4.63版本都试过了,权限问题,安装后跑不...
  • avi9111
  • avi9111
  • 2016年06月29日 10:48
  • 825

简易MonoScript序列化数据字段分析器

本文分享一个用于分析MonoBehaviour上序列化数据字段信息的工具在使用Unity开发中,我们有时需要分析挂在Prefab上脚本的序列化数据格式,比如: 做增量式的Asset Bundle打包时...
  • lujian1000
  • lujian1000
  • 2017年02月26日 17:39
  • 165

ATL学习笔记(3): QueryInterface功能的实现

在CComObjectRootEx类中,实现了线程安全的引用计数管理。而在CComObjectRootEx的父类CComObjectRootBase中,存在对QueryInterface的一个内部实现...
  • DarkMagician_Potter
  • DarkMagician_Potter
  • 2014年06月04日 11:37
  • 823

flume1.7 TailDirSource断点续传与文件更名后数据重复采集的bug修复

简介      flume1.7新增了组件Taildir Source(详情参见官方链接:http://flume.apache.org/FlumeUserGuide.html#taildir-...
  • mcj1314bb
  • mcj1314bb
  • 2017年12月20日 10:55
  • 42

Kafka Producer同步模式发送message源码分析

先把几个比较重要的方法列出来 // 入口,处理 message及messages   def handle(events: Seq[KeyedMessage[K,V]]) //处理序列化的K...
  • chrischen214
  • chrischen214
  • 2014年02月25日 18:45
  • 10152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QueryInterface XXXX failed when loading Enterprise Serviced Components
举报原因:
原因补充:

(最多只允许输入30个字)