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