日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

COM組件(01)

系統(tǒng) 2118 0

????? ?VC環(huán)境下利用ATL開發(fā)COM組件
??????摘 要:介紹了COM的基本原理以及如何利用ATL在VC環(huán)境下開發(fā)COM組件,并給出了程序?qū)崿F(xiàn)。

  關(guān)鍵字:COM;ATL;組件

  1. 概述

  組件式軟件技術(shù)已經(jīng)成為當(dāng)今軟件技術(shù)的潮流之一。組件技術(shù)的基本思想是:將大而復(fù)雜的應(yīng)用軟件分成一系列的可先行實(shí)現(xiàn)

、易于開發(fā)、理解、復(fù)用和調(diào)整的軟件單元,稱為組件(Components)。采用組件技術(shù)有利于在整個(gè)計(jì)算機(jī)工業(yè)中形成軟件開發(fā)的規(guī)

模效益,具有縮短開發(fā)時(shí)間、降低集成費(fèi)用和軟件維護(hù)費(fèi)用等優(yōu)點(diǎn)。同其它任何一個(gè)具有可改變部分的系統(tǒng)一樣,標(biāo)準(zhǔn)對于組件架

構(gòu)也是很重要的。目前主要的標(biāo)準(zhǔn)有Microsoft的COM/DCOM,Java的JavaBeans和EJB,OMG組織的CORBA。早在幾年以前,微軟就提出

了COM的概念,經(jīng)過多年軟件開發(fā)的積淀,COM已經(jīng)日益完善和成熟。目前Microsoft的幾乎所有應(yīng)用程序都使用了COM。Microsoft

的Visual C++自從4.2版開始推出完全面向COM組件開發(fā)的ATL2.0,在此開發(fā)平臺(tái)上,程序員可以充分發(fā)揮自己的才智與專長編寫出

COM組件模塊。

  2. 組件的基本原理

  組件是一種能夠提供某種服務(wù)的自包含的軟件模塊,它封裝了一定的數(shù)據(jù)(屬性)和方法,隱藏了具體的實(shí)現(xiàn)細(xì)節(jié),并提供特

定的接口,開發(fā)人員利用這一特定的接口來使用組件,并使其與其它組件交互通訊,以此來構(gòu)造應(yīng)用程序。開發(fā)人員還可以對組件

單獨(dú)進(jìn)行升級(jí),改進(jìn)原來的功能,卻不影響整個(gè)應(yīng)用系統(tǒng)的運(yùn)行,只要保證組件對外界的接口保持不變。這使得應(yīng)用程序可以隨時(shí)

向前發(fā)展進(jìn)化。組件的概念是獨(dú)立于編程語言的,也就是說,用不同語言編寫的組件應(yīng)能在一起協(xié)同工作,或者說用一種語言編寫

的組件能在用另一種語言編寫的應(yīng)用程序中很好地工作。組件和對象的區(qū)別在于:對象封裝了一組相關(guān)的函數(shù),而組件則封裝了一

組相關(guān)的對象,正是這一差異使得組件技術(shù)有可能比面向?qū)ο蠹夹g(shù)更廣泛地被接受。

  COM(Component Object Model--組件對象模型),是微軟公司提出的一種軟件結(jié)構(gòu),得到了Digital Equipment和許多其它公司的

廣泛支持。簡單地說,COM不是編程語言、代碼庫或編譯器,而是一個(gè)構(gòu)造二進(jìn)制兼容軟件組件的規(guī)范,是一種能夠使每個(gè)程序部件

相互操作的標(biāo)準(zhǔn)。COM并不局限于某種編程語言,可使用于任何系統(tǒng)平臺(tái),具有很好的可擴(kuò)展性。遵循COM規(guī)范編寫的組件(簡稱為

COM組件)將能夠滿足對組件架構(gòu)的所有需求。

  3. ATL的一般原理

  ATL(Active Template Library)是微軟的活動(dòng)模板庫,是一個(gè)產(chǎn)生C++/COM代碼的框架,專門用于開發(fā)COM組件。ATL提供了小

巧、高效、靈活的類,這些類為創(chuàng)建可互操作的COM組件提供了基本的設(shè)施。在Visual C++中,我們既可以使用MFC也可以使用ATL。

MFC完全面向Windows應(yīng)用,它用C++的封裝技術(shù)建立了一套適合于開發(fā)Windows應(yīng)用的C++類庫,并可在Windows應(yīng)用的基礎(chǔ)上提供相

應(yīng)的COM支持。而ATL則完全面向COM組件,其結(jié)構(gòu)完全針對COM中的諸多規(guī)范。因此,擁有MFC和ATL的VC,是編寫COM組件的最強(qiáng)工具

。

 4. 利用ATL創(chuàng)建組件的實(shí)例

  4.1. 創(chuàng)建步驟

  首先在VC集成環(huán)境里建立一個(gè)新的工程,即從New對話框中Projects選項(xiàng)卡上選擇ATL COM AppWizard,然后,輸入工程的名字

和其位置,工程的名字將成為最終生成的DLL或EXE文件的名字。點(diǎn)擊OK按鈕,其它的接受默認(rèn)設(shè)置即可。現(xiàn)在即可在此項(xiàng)目里創(chuàng)建

COM對象。在VC5.0以后的版本,在“Insert”菜單中點(diǎn)擊“New ATL Object”菜單項(xiàng),就彈出ATL Object Wizard對話框,它分為

左右兩個(gè)框,在左邊框里選擇“Objects”,在右邊框里選擇“Simple Object”,然后點(diǎn)擊“Next”按鈕。于是ATL Object Wizard

 Properties對話框?qū)⒊霈F(xiàn),在“Names”選項(xiàng)卡的“Short Name”中輸入組件對象的名字,其它的屬性會(huì)自動(dòng)被填入,你也可以編

輯改變它們。在“Attributes”選項(xiàng)卡中,接受默認(rèn)設(shè)置即可。如有必要,可將線程模式改為“Both”,如果需要報(bào)告詳細(xì)錯(cuò)誤信息

,可將“Support I Support Error Info”選中。

  4.2. 創(chuàng)建實(shí)例和代碼

  下面以一個(gè)具體的實(shí)例實(shí)現(xiàn)一個(gè)組件DataAccess,它是將指定文件中的內(nèi)容讀取出來并存儲(chǔ)在一個(gè)數(shù)組中,其短名字為ReadFile

。此組件有一個(gè)方法:LoadFile,為了判斷文件讀取是否成功,應(yīng)使得此方法的最后一個(gè)參數(shù)為布爾型返回值,并聲明類型為[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及其參數(shù):

[in]BSTR FileName, [out,retval]BOOL* result

  當(dāng)點(diǎn)擊“OK”后,相關(guān)的代碼將被增加到.IDL,.H和.CPP文件中。在ReadFile.cpp文件中增加LoadFile方法如下:

STDMETHODIMP CReadFile:: LoadFile (BSTR FileName,BOOL* result)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())
 CStdioFile f;
 CString FileData;
 Cstring Datas[255]; //用于存放從文件中讀出的數(shù)據(jù)
 int i=0; //數(shù)組下標(biāo)
 USES_CONVERSION;
 if(f.Open(W2A(FileName),CFile::modeRead))
 { //文件成功打開
  while(f.ReadString(FileData))
  { //處理讀出的數(shù)據(jù)
   Datas[i]= FileData;
   i++;
  }
  f.Close();
  *result=true;
  return S_OK; //關(guān)閉文件,返回結(jié)果為真
 }
 else
 { //文件打開失敗
  *result=false; //返回參數(shù)為false
  return E_FAIL;
 }
}?

  4.3. 測試

  為了測試所寫的組件,可以編寫一個(gè)測試程序。在New對話框中Projects選項(xiàng)卡上選擇Win32 Console Application,輸入工程

名為test,選擇“Add to current workspace”,并并將”Deendency of:”選項(xiàng)打勾。點(diǎn)擊“OK”,其余的接受默認(rèn)設(shè)置即可?,F(xiàn)

在即可在此工程里測試剛才所編寫的組件。在test.cpp中,增加

#include <atlbase.h>
#include "..\DataAccess_i.c"
#include "..\DataAccess.h"
?

  在main主函數(shù)中包含如下語句:

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))
{ //創(chuàng)建組件實(shí)例失敗
 return -1;
}
USES_CONVERSION;
CString FILENAME=".\\Palette.txt";
hr=pIRF->LoadFile(A2W(FILENAME),&result);
if(FAILED(hr))
{
 return -1;
}

  為了驗(yàn)證組件是否完成所要求的功能,可在組件及測試程序中加入適當(dāng)?shù)妮敵稣Z句。

  以上程序在VC6.0中編譯并測試通過,所編寫的組件能夠很好地完成要求。

  5. 結(jié)束語

  組件技術(shù)得到越來越廣泛的應(yīng)用,而VC提供的活動(dòng)模板庫為我們創(chuàng)建功能強(qiáng)大的COM組件提供了很好的框架。我們相信,本文總

結(jié)的COM組件編寫方法能對其他人員編寫類似的組件程序有所幫助。

COM組件(01)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: SHOW| 广宁县| 涞源县| 兴仁县| 岳池县| 邵阳市| 湟中县| 松桃| 巴彦淖尔市| 博野县| 闸北区| 丰城市| 开平市| 鹤峰县| 方正县| 岢岚县| 渭南市| 石景山区| 平和县| 高州市| 泰来县| 新平| 亳州市| 安图县| 大竹县| 察哈| 阿合奇县| 永新县| 额济纳旗| 澄江县| 碌曲县| 偃师市| 镇江市| 东莞市| 右玉县| 镇坪县| 枝江市| 凤冈县| 枞阳县| 金坛市| 东丰县|