熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

ActiveX Template Library-(ATL)簡介二

2022-06-13   來源: Windows系統管理 

   ATL基本技術
  
    雖然使用ATL開發COM 應用是一件非常簡單的事情但是在ATL簡單易用的界面後面卻包含著復雜的技術面對ATL生成的大量代碼我們即使不去深入地了解這些代碼的含義也可以開發出COM應用來但是如果我們要充分地挖掘ATL的潛力開發出更靈活強大的COM應用則必須對ATL使用的基本技術有所了解研究ATL的實質最好的教材就是由Visual C++提供的ATL源代碼本文這一部分只是對ATL中用到的最基本的技術進行簡單的介紹
    簡單地說來ATL中所使用的基本技術包括以下幾個方面
    COM技術
    C++模板類技術(Template)
    C++多繼承技術(MultiInheritance)
    COM技術是理解ATL的基礎使用ATL進行開發要對COM技術的基本概念有最低限度的了解由於COM是一項非常復雜龐大的技術體系限於本文的篇幅這裡不再贅述對於本文中提到的COM基本概念也不做過多的解釋請讀者參閱有關的參考書籍
    作為ATL最核心的實現技術的模板是對標准C++語言的擴展但是在大多數的C++編程環境中人們很少使用它這是因為模板的功能雖然很強但是它內部機制比較復雜需要比較多的C++知識和經驗才能靈活地使用它在MFC中的CObjectArray等功能類就是由模板來定義的完全通過模板來定義程序的整體類結構ATL是迄今為止做得最為成功的
    所謂模板類簡單地說是對類的抽象我們知道C++語言用類定義了構造對象(這裡指C++對象而不是COM對象)的方式對象是類的實例而模板類定義的是類的構造方式使用模板類定義實例化的結果產生的是不同的類因此可以說模板類是類的類
    在C++語言中模板類的定義格式如下
    template < class T>
    class MyTemp
    {
    MyTemp( ){ };
    ~MyTemp( ) { };
    int MyFunc( int a) ;
    }
    …………
    Int MyTemp::MyFunc( int a)
    {
    }
    首先使用C++的關鍵字template來聲明一個模板類的定義在關鍵字後面是用尖括號括起來的類型參數正是根據這個類型參數編譯器才能在編譯過程中將模板類的具體定義轉化為一個實際的類的定義即生成一個新的類接下來的定義方式與普通的類定義十分相似只是在類的函數定義中都要帶有類型參數的說明
    下面的程序段說明了模板類的用法
    typedef MyTemp myclassfromtemp;
    myclassfromtemp m;
    int a = mMyfunc();
    通常在使用模板類時為了方便起見使用一個關鍵字typedef為新定義出來的類取一個名字在上面的程序段中假設MyClass是一個由用戶定義的類通過將這個類的名字作為類型參數傳遞給模板類我們可以創建一個新的類這個類的行為將以模板類的定義為基礎例如它具有模板類定義的所有成員函數同時這個類又是對模板類行為的一種修改這種修改是通過用戶提供的類型參數來實現的賦予模板類以不同的類型參數則得到行為框架相似但具體行為不同的一組類的集合有了新的類的定義以後我們可以象使用普通類一樣來創建一個類的實例即一個新的對象並且調用這個對象的成員函數
    模板類是對標准C++語言的最新擴展雖然它的功能很強大但是要想使用好模板類需要相當多的關於語言和編程的經驗和知識而且錯誤地使用模板類又會對程序的結構和運行效率帶來大的副作用因此一般的編程環境和編程書籍對模板類的使用都采取謹慎的態度而ATL的核心就是由幾十個模板類構成的通過研究ATL的源代碼可以使我們對模板類的使用有比較深刻全面的認識
    多繼承技術同模板一樣是C++語言中極具爭議性的技術使用多繼承技術可以使程序的設計和實現更加靈活但是由於多繼承的復雜性和自身概念上的一些問題使多繼承在各種面向對象的語言環境中得到的支持都非常有限例如Small Talk根本就不允許多繼承同樣MFC也不支持多繼承技術
    多繼承最大的問題是所謂的鑽石結構例如下面的代碼
    class A
    {
    
    };
    class B : public A
    {
    
    };
    class C : public A
    {
    
    };
    class D : public CB
    {
    
    }
    由於類D同時從類C和B繼承因此在下面的語句中就會發生歧義
    D* pD = new D;
    (A*)pD>Func();
    由於類D通過類C和類B 分別繼承了類A這裡的強制轉化就會發生歧義
    ATL使用了C++最新規范中加入的兩個運算符號 static_castdynamic_cast代替簡單的強制轉化從而消除多繼承帶來的歧義使用這兩個運算符號我們可以在對象運行過程中獲取對象的類型信息上面的代碼可以采用下面的方式修改
    D* pD = new D;
    static_cast(static_cast(pD))>Func();
    為什麼模板類和多繼承技術會成為ATL主要的工具呢?原因在於采用模板可以在編譯過程中快速的生成具有用戶定制功能的類這對於COM這樣一個復雜的技術體系在實現效率上得到了很大的提高通過使用模板類用戶可以把精力集中在自己開發的類的基本邏輯上在完成了自己的類的設計以後通過繼承不同的類生成不同的模板類就可以快速地實現COM的功能同時又避免了采用單繼承結構造成的大量功能冗余
    總之正是由於在設計實現過程中采用了模板類和多繼承技術才使ATL成為一個小巧靈活的COM開發工具能夠適應開發人員對COM應用開發的各種需要

From:http://tw.wingwit.com/Article/os/xtgl/201311/9420.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.