?????
?VC環境下利用ATL開發COM組件
??????摘 要:介紹了COM的基本原理以及如何利用ATL在VC環境下開發COM組件,并給出了程序實現。
關鍵字:COM;ATL;組件
1. 概述
組件式軟件技術已經成為當今軟件技術的潮流之一。組件技術的基本思想是:將大而復雜的應用軟件分成一系列的可先行實現
、易于開發、理解、復用和調整的軟件單元,稱為組件(Components)。采用組件技術有利于在整個計算機工業中形成軟件開發的規
模效益,具有縮短開發時間、降低集成費用和軟件維護費用等優點。同其它任何一個具有可改變部分的系統一樣,標準對于組件架
構也是很重要的。目前主要的標準有Microsoft的COM/DCOM,Java的JavaBeans和EJB,OMG組織的CORBA。早在幾年以前,微軟就提出
了COM的概念,經過多年軟件開發的積淀,COM已經日益完善和成熟。目前Microsoft的幾乎所有應用程序都使用了COM。Microsoft
的Visual C++自從4.2版開始推出完全面向COM組件開發的ATL2.0,在此開發平臺上,程序員可以充分發揮自己的才智與專長編寫出
COM組件模塊。
2. 組件的基本原理
組件是一種能夠提供某種服務的自包含的軟件模塊,它封裝了一定的數據(屬性)和方法,隱藏了具體的實現細節,并提供特
定的接口,開發人員利用這一特定的接口來使用組件,并使其與其它組件交互通訊,以此來構造應用程序。開發人員還可以對組件
單獨進行升級,改進原來的功能,卻不影響整個應用系統的運行,只要保證組件對外界的接口保持不變。這使得應用程序可以隨時
向前發展進化。組件的概念是獨立于編程語言的,也就是說,用不同語言編寫的組件應能在一起協同工作,或者說用一種語言編寫
的組件能在用另一種語言編寫的應用程序中很好地工作。組件和對象的區別在于:對象封裝了一組相關的函數,而組件則封裝了一
組相關的對象,正是這一差異使得組件技術有可能比面向對象技術更廣泛地被接受。
COM(Component Object Model--組件對象模型),是微軟公司提出的一種軟件結構,得到了Digital Equipment和許多其它公司的
廣泛支持。簡單地說,COM不是編程語言、代碼庫或編譯器,而是一個構造二進制兼容軟件組件的規范,是一種能夠使每個程序部件
相互操作的標準。COM并不局限于某種編程語言,可使用于任何系統平臺,具有很好的可擴展性。遵循COM規范編寫的組件(簡稱為
COM組件)將能夠滿足對組件架構的所有需求。
3. ATL的一般原理
ATL(Active Template Library)是微軟的活動模板庫,是一個產生C++/COM代碼的框架,專門用于開發COM組件。ATL提供了小
巧、高效、靈活的類,這些類為創建可互操作的COM組件提供了基本的設施。在Visual C++中,我們既可以使用MFC也可以使用ATL。
MFC完全面向Windows應用,它用C++的封裝技術建立了一套適合于開發Windows應用的C++類庫,并可在Windows應用的基礎上提供相
應的COM支持。而ATL則完全面向COM組件,其結構完全針對COM中的諸多規范。因此,擁有MFC和ATL的VC,是編寫COM組件的最強工具
。
4. 利用ATL創建組件的實例
4.1. 創建步驟
首先在VC集成環境里建立一個新的工程,即從New對話框中Projects選項卡上選擇ATL COM AppWizard,然后,輸入工程的名字
和其位置,工程的名字將成為最終生成的DLL或EXE文件的名字。點擊OK按鈕,其它的接受默認設置即可。現在即可在此項目里創建
COM對象。在VC5.0以后的版本,在“Insert”菜單中點擊“New ATL Object”菜單項,就彈出ATL Object Wizard對話框,它分為
左右兩個框,在左邊框里選擇“Objects”,在右邊框里選擇“Simple Object”,然后點擊“Next”按鈕。于是ATL Object Wizard
Properties對話框將出現,在“Names”選項卡的“Short Name”中輸入組件對象的名字,其它的屬性會自動被填入,你也可以編
輯改變它們。在“Attributes”選項卡中,接受默認設置即可。如有必要,可將線程模式改為“Both”,如果需要報告詳細錯誤信息
,可將“Support I Support Error Info”選中。
4.2. 創建實例和代碼
下面以一個具體的實例實現一個組件DataAccess,它是將指定文件中的內容讀取出來并存儲在一個數組中,其短名字為ReadFile
。此組件有一個方法:LoadFile,為了判斷文件讀取是否成功,應使得此方法的最后一個參數為布爾型返回值,并聲明類型為[out,
retval]。如是VC4.2版,在DataAccess.idl文件IReadFile:Idispatch塊中加入如下代碼:
[helpstring("Read File Data")] HRESULT LoadFile([in]BSTR FileName, [out,retval]BOOL* result);
如果是在VC5.0以后的版本中,在ClassView中右擊IReadFile,在彈出的對話框中輸入方法的名字LoadFile及其參數:
[in]BSTR FileName, [out,retval]BOOL* result
當點擊“OK”后,相關的代碼將被增加到.IDL,.H和.CPP文件中。在ReadFile.cpp文件中增加LoadFile方法如下:
STDMETHODIMP CReadFile:: LoadFile (BSTR FileName,BOOL* result)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CStdioFile f;
CString FileData;
Cstring Datas[255]; //用于存放從文件中讀出的數據
int i=0; //數組下標
USES_CONVERSION;
if(f.Open(W2A(FileName),CFile::modeRead))
{ //文件成功打開
while(f.ReadString(FileData))
{ //處理讀出的數據
Datas[i]= FileData;
i++;
}
f.Close();
*result=true;
return S_OK; //關閉文件,返回結果為真
}
else
{ //文件打開失敗
*result=false; //返回參數為false
return E_FAIL;
}
}?
4.3. 測試
為了測試所寫的組件,可以編寫一個測試程序。在New對話框中Projects選項卡上選擇Win32 Console Application,輸入工程
名為test,選擇“Add to current workspace”,并并將”Deendency of:”選項打勾。點擊“OK”,其余的接受默認設置即可。現
在即可在此工程里測試剛才所編寫的組件。在test.cpp中,增加
#include <atlbase.h>
#include "..\DataAccess_i.c"
#include "..\DataAccess.h"
?
在main主函數中包含如下語句:
IReadFile * pIRF=NULL;
BOOL result=false;
//初始化com庫
HRESULT hr=::CoInitialize(NULL);
if(FAILED(hr))
{ //初始化失敗
return -1;
}
hr=::CoCreateInstance(CLSID_ReadFile,NULL,CLSCTX_INPROC_SERVER,IID_IReadFile, (void**)&pIRF);
if(FAILED(hr))
{ //創建組件實例失敗
return -1;
}
USES_CONVERSION;
CString FILENAME=".\\Palette.txt";
hr=pIRF->LoadFile(A2W(FILENAME),&result);
if(FAILED(hr))
{
return -1;
}
為了驗證組件是否完成所要求的功能,可在組件及測試程序中加入適當的輸出語句。
以上程序在VC6.0中編譯并測試通過,所編寫的組件能夠很好地完成要求。
5. 結束語
組件技術得到越來越廣泛的應用,而VC提供的活動模板庫為我們創建功能強大的COM組件提供了很好的框架。我們相信,本文總
結的COM組件編寫方法能對其他人員編寫類似的組件程序有所幫助。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
