com學習筆記(1)基礎介面的定義

weixin_34219944發表於2009-07-05

    看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元件基本無關的.

相關文章