看com组件方面的东西大概也有3个多月了.看到com本质论的作者说6个月才对com有感觉,所以我深感欣慰哈…之前学习com完全是为了wpf,然后就一发不可收拾,知识体系发生非常大的变化.看的第一本书是潘爱民的 com原理与应用,此书是作者看了n多书总结的,像我等初学者看了这么多理论,非常之艰难,这书可不是什么武打小说,均是密密麻麻的理论...不过还是苦苦坚持看了2个月,后来发现com技术内幕和com本质论,先从com技术内幕开始就好多了。我们还是少一些理论,多一些代码,学起来就有乐趣多了.然后提出疑问.
所以学习的资料则是
- com技术内幕
- com本质论
- com原理与应用
一.c++接口的实现
c++没有接口概念,只有抽象类.
1.定义接口(纯抽象类)
如下,用virtual关键字表明该方法为抽象方法,未实现的方法后面+ =0
class IX { public: virtual void Fx1() = 0 ; virtual void Fx2() = 0 ; } ;
2.实现接口
类可以多重继承,但为了简单,所以就用一个接口.
class CA : public IX{ public: // Implement interface IX. virtual void Fx1() {cout << "CA::Fx1" << endl ;} virtual void Fx2() {cout << "CA::Fx2" << endl ;} }
到这里为止跟com一点关系都没有的.
二.接口定义的简化(伪纯抽象类)
由于c++并无interface关键字,为了编码约定,可以用#define关键字定义,将类改成接口.
#define interface struct
现在我们可以重新定义IX,注意此处不用把方法标记为public,struct默认把成员公开.这样就简化了接口的定义
如下
interface IX { virtual void Fx1() = 0 ; virtual void Fx2() = 0 ; } ;
这样是不是很简单了?
三.标准调用
由于c++编译器各不同,方法的调用方式各有不同,可先参考这里.
微软平台的com接口大部分(即推荐用法,话不敢说死,所以无需纠缠)均采用__stdcall这种标准调用约定
现在为每个方法加上__stdcall调用约定,如下代码
interface IX { virtual void __stdcall Fx1() = 0 ; virtual void __stdcall Fx2() = 0 ; } ;
当然具体实现的类,也需要改变,如下代码
class CA : public IX{ public: virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl ;} virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl ;} }
定义好接口和实现这些接口后,我们接下就是要使用这些接口
四.调用接口
int main() { CA* pA = new CA ; // Get an IX pointer. IX* pIX = pA ; pIX->Fx1() ; pIX->Fx2() ; delete pA ; return 0 ; }
到目前为止,跟com组件根本搭不上边.我们且称这是一个组件(中间件,类库…)都可以.
五.虚拟函数表vtbl(virtual function table)
1.虽然com接口号称语言,无关性,为何我们还是选择c++作为编写的语言,而不是c#或者java?
2.c++抽象基类怎么说成是com接口?
我们先重新来看那段接口的代码.
interface IX { virtual void __stdcall Fx1() = 0 ; virtual void __stdcall Fx2() = 0 ; } ;
又是概念
当定义了一个抽象基类,也就定义了相应的内存结构,派生类实现了该抽象类才会被分配.
虚拟函数表包含一组指向虚拟函数实现的指针.
以上可以不管.下面的话才是重要的.
似乎是偶然的巧合,com接口的内存结构同c++编译器为抽象基类等所生成的内存结构是相同的。。。
由于这个巧合,IX即是接口,又是抽象基类。
由于这个巧合,我们就选择了c++,就像阿里的招聘广告 If not you,who?
六.关于类,接口,组件的一些简单理论概念
1.类非组件
组件这一称法太过专业,可以当作一个功能模块,按我的理解可以一个控件也是一个组件,如DataGrid是一个组件,DataGrid是由n多类组成一个功能强大的控件,所以类非组件. 话说话来,简单的组件也可以由一个类组成。概念而已,无需理会.不知道也不会怎么样…
2.接口与类的继承关系
一个类可以继承多个接口实现,也可以由一个接口一个类实现…
3.多重接口继承
即多个类继承相同接口(可以是多个接口),不同实现…
4.命名冲突
怎么办?改名…要是遇到别人骚扰你,你改名,他也改名就没办法了...
好了,先写到这里.这篇其实与com组件基本无关的.