亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

COM組件(01)

系統 1837 0

????? ?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組件編寫方法能對其他人員編寫類似的組件程序有所幫助。

COM組件(01)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 九九色影院 | 免费一级大毛片a一观看不卡 | 中文字幕不卡免费视频 | 国产精品亚洲一区在线播放 | 精品国产自在现线看久久 | 伊人网站在线观看 | 青青青视频在线 | 一本久久a久久精品亚洲 | 久久美女免费视频 | 日本视频中文字幕一区二区 | 色人阁在线 | 亚洲精品综合一区二区三区在线 | 国产情精品嫩草影院88av | 福利在线免费视频 | 妇女毛片| 乱色欧美videos黑人 | 99这里| 久久久久久久蜜桃 | 福利视频欧美一区二区三区 | 久久国产乱子伦精品免费强 | 91视频福利 | 久久精品六 | 久久只有精品视频 | 久久久久久国产精品免费 | 亚洲精品第五页中文字幕 | 国产黄色一级大片 | 亚洲欧美日韩国产精品网 | 欧美伊人久久久久久久久影院 | 亚洲综合图片 | 国产美女久久久久久久久久久 | 人人澡人人澡人人看欧美 | 国产视频一二 | 久久国产精品系列 | 久久麻豆精品 | 成人欧美日韩 | 四虎影视久久久免费 | 亚洲综合图色 | 91精品成人免费国产片 | 国产成人a在一区线观看高清 | 赛车总动员2在线观看 | 久久99国产乱子伦精品免费 |