COM组件原理

来源:互联网 发布:淘宝子账户和主账户 编辑:程序博客网 时间:2024/05/24 00:01

在COM中,接口就是一个抽象类,每个接口有一个接口ID(uuid)。一个COM组件通常是连续继承下来的类,比如 IUNknow ->IDispath->IXX->CXX。这就形成了一个COM组件,当然组件一般是一个钻石继承的样子,这里为了简化原理把他们当成一个串形继承下来。


每个COM组件都有一个CLSID(uuid),这个CLSID是注册的时候写进注册表的,可以把这个CLSID理解为这个组件最终可以实例化的子类的一个ID。这样就可以通过查询注册表中的CLSID来找到COM组件所在的dll的名称。然后调用的时候。会调用DllGetClassObject()函数, 这个函数中第一个参数是CLSID,表明想要调用DLL中的哪个组件(需要提醒的是,一个DLL中不一定只有一个组件)。第二个参数为IID。表明要返回这个组件的哪个接口。一般都会有IUnKnow 和IDispath接口。如果想用到IXX接口,就可以使用接口查询来转成IXX接口。如果想使用接口调度,不包含IXX的头文件来调用IXX的方法,就可以使用IDispath接口的Invoke方法。


需要注意的是:COM可以看作一种框架,但这个框架可大可小。有时候我们不需要太多的其它功能。就会对这个框架精简一些(如windows登录机制里的CP)。但原理还是一样的。所以遇到COM组件的时候不要一根筋,非要纠结这个与标准的COM的不同之处。


原创粉丝点击