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

COM組件(01)

系統(tǒng) 2090 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)用軟件分成一系列的可先行實現(xiàn)

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

模效益,具有縮短開發(fā)時間、降低集成費用和軟件維護費用等優(yōu)點。同其它任何一個具有可改變部分的系統(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ā)平臺上,程序員可以充分發(fā)揮自己的才智與專長編寫出

COM組件模塊。

  2. 組件的基本原理

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

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

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

向前發(fā)展進化。組件的概念是獨立于編程語言的,也就是說,用不同語言編寫的組件應(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òu)造二進制兼容軟件組件的規(guī)范,是一種能夠使每個程序部件

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

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

  3. ATL的一般原理

  ATL(Active Template Library)是微軟的活動模板庫,是一個產(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組件的最強工具

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

  4.1. 創(chuàng)建步驟

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

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

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

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

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

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

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

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

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

。此組件有一個方法:LoadFile,為了判斷文件讀取是否成功,應(yīng)使得此方法的最后一個參數(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)點擊“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. 測試

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

名為test,選擇“Add to current workspace”,并并將”Deendency of:”選項打勾。點擊“OK”,其余的接受默認設(shè)置即可。現(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)建組件實例失敗
 return -1;
}
USES_CONVERSION;
CString FILENAME=".\\Palette.txt";
hr=pIRF->LoadFile(A2W(FILENAME),&result);
if(FAILED(hr))
{
 return -1;
}

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

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

  5. 結(jié)束語

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

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

COM組件(01)


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 汕头市| 宜川县| 丰城市| 景德镇市| 塔河县| 霍城县| 华亭县| 德州市| 聂拉木县| 鱼台县| 阆中市| 进贤县| 平阴县| 施甸县| 梅州市| 德化县| 新巴尔虎右旗| 明溪县| 永济市| 淄博市| 新和县| 崇州市| 大庆市| 固始县| 房产| 九江市| 建瓯市| 麻江县| 和平区| 涿鹿县| 锡林浩特市| 灵山县| 道孚县| 三台县| 彭州市| 盱眙县| 曲阳县| 文山县| 伊金霍洛旗| 宿州市| 中阳县|