代码改变世界

com学习笔记(1)基础接口的定义

2009-07-05 12:08  Clingingboy  阅读(1778)  评论(1编辑  收藏  举报

    看com组件方面的东西大概也有3个多月了.看到com本质论的作者说6个月才对com有感觉,所以我深感欣慰哈…之前学习com完全是为了wpf,然后就一发不可收拾,知识体系发生非常大的变化.看的第一本书是潘爱民的 com原理与应用,此书是作者看了n多书总结的,像我等初学者看了这么多理论,非常之艰难,这书可不是什么武打小说,均是密密麻麻的理论...不过还是苦苦坚持看了2个月,后来发现com技术内幕和com本质论,先从com技术内幕开始就好多了。我们还是少一些理论,多一些代码,学起来就有乐趣多了.然后提出疑问.

所以学习的资料则是

  1. com技术内幕
  2. com本质论
  3. 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组件基本无关的.