zoukankan      html  css  js  c++  java
  • com学习笔记(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组件基本无关的.

  • 相关阅读:
    微软消息队列
    使用Memcached Provider客户端的increment()||decrement()操作小结
    SQL While And Sql Array
    好管理是成功的99%
    Javascript图片无缝滚动
    javascript数组复习
    前端面试题--js切换td中的值
    推荐使用:易企在线客服升级版
    drupal中根据不同的内容类型节点显示不同的样式
    defer和async(原生js学习)转
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1517121.html
Copyright © 2011-2022 走看看