COM 組件設計與應用(六)
用 ATL 寫第一個組件
作者:楊老師
下載源代碼
一、前言
1、與 《COM 組件設計與應用(五)》的內容基本一致。但本回講解的是在 vc.Net 2003 下的使用方法,即使你不再使用vc6.0,也請和上一回的內容,參照比對。
2、這第一個組件,除了所有 COM 組件必須的 IUnknown 接口外,我們再實現一個自己定義的接口 IFun,它有兩個函數: Add()完成兩個數值的加法,Cat()完成兩個字符串的連接。
3、下面......好好聽講! 開始了:-)
二、建立 ATL 工程
步驟2.1:建立一個解決方案。
步驟2.2:在 該解決方案中,新建一個 vc++ 的 ATL 項目。示例程序叫 Simple2,並選擇DLL方式,見圖一、圖二。
圖一、新建 ATL 項目
圖二、選擇非屬性化的DLL組件類型
屬性化 屬性化編程,是未來的方向,但我們現在先不要選它。
動態鏈接庫(DLL) 選擇它。
可執行文件(EXE) 以後再講。
服務(EXE) 表示建立一個系統服務組件程序,系統啟動後就會加載並執行的程序。
允許合並代理/存根(stub)代碼 選擇該項表示把“代理/存根”代碼合並到組件程序中,否則需要單獨編譯,單獨注冊代理存根程序。代理/存根,這個是什麼概念?還記得我們在上回書中介紹的嗎?當調用者調用進程外或遠程組件功能的時候,其實是代理/存根負責數據交換的。關於代理/存根的具體變成和操作,以後再說啦......
支持 MFC 除非有特殊的原因,我們寫 ATL 程序,最好不要選擇該項。你可能會說,如果沒有MFC的支持,那CString怎麼辦呀?告訴你個秘密吧,一般人我都不告訴他,我後半輩子就靠著這個秘密活著了:
1、你會STL嗎?可以用 STL 中的 string 代替;
2、自己寫個 MyString 類,嘿嘿;
3、悄悄地、秘密地、不要告訴別人(特別是別告訴微軟),把 MFC 中的 CString 源碼拿過來用;
4、使用 CComBSTR 類,至少也能簡化我們字符串操作;
5、直接用 API 操作字符串,反正我們大家學習 C 語言的時候,都是從這裡干起的。(等於沒說,呵呵)
支持 COM+ 1.0 支持事務處理的 COM+ 功能。COM+ 也許在第 99 回介紹吧。
三、添加 ATL 對象類
步驟3.1:菜單"項目\添加類..."(或者用鼠標右鍵在 項目中彈出菜單"添加\添加類...")並選擇 ATL 簡單對象。見圖三。
圖三、選擇建立ATL簡單對象
除了簡單對象(只實現了 IUnknown 接口),還可以選擇“ATL控件”(ActiveX,實現了10多個接口)......可以選擇的組件對象類型很多,但本質上,就是讓向導幫我們默認加上一些接口。在以後的文章中,陸續介紹吧。
步驟3.2:增加自定義類 CFun(接口 IFun) ,見圖四。
STDMETHODIMP CFun::Add(long n1, long n2, long *pVal){ *pVal = n1 + n2; return S_OK;}這個太簡單了,不再浪費“口條”。下面我們實現字符串連接的Cat()函數:
STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal){ int nLen1 = ::SysStringLen( s1 ); // s1 的字符長度 int nLen2 = ::SysStringLen( s2 ); // s2 的字符長度 *pVal = ::SysAllocStringLen( s1, nLen1 + nLen2 );// 構造新的 BSTR 同時把 s1 先保存進去 if( nLen2 ) { ::memcpy( *pVal + nLen1, s2, nLen2 * sizeof(WCHAR) ); // 然後把 s2 再連接進去// wcscat( *pVal, s2 ); } return S_OK;}學生:上面的函數實現,完全是調用基本的 API 方式完成的。
STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal){ CComBSTR sResult( s1 ); sResult.AppendBSTR( s2 ); *pVal = sResult.Copy();// *pVal = sResult.Detach(); return S_OK;}學生:哈哈,好!使用了 CComBSTR,這個就簡單多了。CComBSTR::Copy()和CComBSTR::Detach()有什麼區別?
而CComBSTR::Detach()是使對象與內部的 BSTR 指針剝離,這個函數由於沒有復制過程,因此速度稍微快一點點。但要注意,一但剝離後,就不能再使用該對象啦。
學生:老師,您講的太牛啦,我對您的敬仰如巍巍泰山,直入雲霄......
老師:STOP,STOP!留作業啦......
1、自己先按照今天講的內容寫出這個組件;
2、不管你懂不懂,一定要去觀察 IDL 文件,CPP 文件;
3、編譯後,看都產生了些什麼文件?如果是文本的文件,就打開看看;
4、下載本文的示例程序(vc.Net 2003版本)編譯運行,看看效果。然後預習一下示例程序中的調用方法;
學生:知道啦,快下課吧,我要上廁所,我都憋的不行了......
老師:下課!別忘了頂我的帖子呀......
六、小結
本回介紹第一個ATL組件程序的建立步驟,而如何使用該組件,敬請關注《COM 組件設計與應用(七)》。