zoukankan      html  css  js  c++  java
  • COM技术の接口

    什么是接口
    DLL的接口可以理解为其导出的那些函数,C++类的接口则是该类的一个成员函数集。
    对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址。对COM而言,接口就是这样的一个内存结构,无关细节与具体语言实现。(即不管是C#还是C++实现,只要给我这么个内存结构,我就认为你是一个接口)
    接口的作用
    接口对COM来说很总要!只需记住下面三点:
    (1)COM中接口就是一切。
    (2)对客户而言,一个组件就是一个接口集合(客户通过QueryInterface获取想要的接口)。
    (3)客户只能通过接口与COM组件打交道。
    COM接口在C++中的代码实现
    参加COM中接口的定义,在C++中,可以通过抽象基类来实现COM接口。
    抽象基类,其实是定义了一个内存结构,抽象基类仅包含虚函数,因此其包含虚表与虚指针。如下图所示,抽象基类如

    interface IX  

    {  

         virtual void STDMETHODTYPE Fx1()=0;  

         virtual void STDMETHODTYPE Fx2()=0;  

         virtual void STDMETHODTYPE Fx3()=0;  

    }  

    其在内存中仅包含一个虚指针,而这个虚指针则指向一组虚函数的实现列表(函数指针数组)。这刚好符合COM对接口的定义。
    因此COM接口在C++中的实现是通过抽象基类实现的。子类继承抽象父类,并实现或重写抽象函数。子类同时也就继承了这种内存结构,即子类获得了向客户提供这种接口的提供能力,同时对于组件对于多个接口的支持,可以通过让子类多重继承抽象父类来实现。
     
    一些细节
    1、标准调用约定
    在Microsoft平台上,COM接口提供的所以函数均遵循PASCAL调用约定,即函数将在返回到调用者之前进行参数的出栈处理。因此接口中的函数均有修饰符__standcall 或STDMETHODCALL
    2、C++中接口虽然是抽象基类实现,但可以不用class来声明类,而是用OBJBASE.H中定义的宏
  • 相关阅读:
    SPOJ Distinct Substrings(后缀数组求不同子串个数,好题)
    POJ 1743 Musical Theme(后缀数组+二分答案)
    HDU 6191 Query on A Tree(可持久化Trie+DFS序)
    swust oj 1052
    swust oj 1051
    swust oj 1016
    swust oj 1014
    swust oj 1013
    swust oj 1012
    swust oj 1011
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/5476604.html
Copyright © 2011-2022 走看看