利用編寫組件_第1頁(yè)
利用編寫組件_第2頁(yè)
利用編寫組件_第3頁(yè)
利用編寫組件_第4頁(yè)
利用編寫組件_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

利用編寫組件第一頁(yè),共四十三頁(yè),編輯于2023年,星期日2利用ATL編寫COM組件 1 COM組件與ATL 2 利用ATL創(chuàng)建COM組件

3 在VC和VB中使用COM組件

第二頁(yè),共四十三頁(yè),編輯于2023年,星期日31 COM組件與ATL目錄1.1 COM概述 1.2 COM與軟件復(fù)用 1.3 與COM有關(guān)的概念1.4 ATL簡(jiǎn)介 第三頁(yè),共四十三頁(yè),編輯于2023年,星期日41.1 COM概述

COM是組件對(duì)象模型,在Windows操作系統(tǒng)下COM組件很多,組件是C++面向?qū)ο笏枷朐谲浖I(yè)的應(yīng)用,它是一種創(chuàng)建二進(jìn)制軟件組件的體系,是一種與平臺(tái)無(wú)關(guān)、語(yǔ)言無(wú)關(guān)、分布式的面向?qū)ο蟮捏w系。它不是一種面向?qū)ο蟮恼Z(yǔ)言,而是一種標(biāo)準(zhǔn),COM描述了如何創(chuàng)建對(duì)象的一個(gè)模型以及在COM對(duì)象間進(jìn)行通訊所需要的內(nèi)容。因此,從功能上講COM更像一個(gè)協(xié)議,一個(gè)二進(jìn)制級(jí)別上組件重用的協(xié)議。

第四頁(yè),共四十三頁(yè),編輯于2023年,星期日51.2 COM與軟件復(fù)用

在軟件開發(fā)過(guò)程中,人們提出軟件的制造能否像硬件的生產(chǎn)一樣,實(shí)現(xiàn)規(guī)約化的組裝。答案是肯定的,利用Microsoft的COM技術(shù)編寫的組件就可以達(dá)到這個(gè)目的。軟件復(fù)用避免了軟件開發(fā)過(guò)程中的重復(fù)勞動(dòng)的解決方案,其出發(fā)點(diǎn)是應(yīng)用系統(tǒng)的開發(fā)不再采用一切“從零開始”的模式,每個(gè)COM組件有自己的屬性和操作,是一個(gè)相對(duì)獨(dú)立運(yùn)行的實(shí)體。從軟件復(fù)用種類的定義看,COM技術(shù)實(shí)質(zhì)上是一種模塊復(fù)用的情況。采用組件開發(fā)軟件就像搭積木一樣容易,組件單獨(dú)開發(fā)并作為軟件模塊使用,它具有明確的接口,客戶通過(guò)這些接口調(diào)用組件所能提供的服務(wù),將多種組件拼裝起來(lái)就能構(gòu)成大型的組件以至建立整個(gè)系統(tǒng)。第五頁(yè),共四十三頁(yè),編輯于2023年,星期日61.3 與COM有關(guān)的概念

1.對(duì)象

對(duì)象代表現(xiàn)實(shí)中的某個(gè)實(shí)體,是類的實(shí)例。在COM中,對(duì)象也是類的實(shí)例,但是COM對(duì)象與面向?qū)ο竽P偷念悓?duì)象有區(qū)別。COM是與軟件開發(fā)語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān),而面向?qū)ο竽P椭械念悓?duì)象在不同的語(yǔ)言下是有區(qū)別的。2.接口

動(dòng)態(tài)鏈接庫(kù)DLL是通過(guò)導(dǎo)出一系列函數(shù)來(lái)讓客戶程序使用的,只有知道了DLL的導(dǎo)出函數(shù)列表才能使用它。COM組件的載體也是一個(gè)DLL,COM組件是通過(guò)接口與客戶進(jìn)行通訊的,但它是一個(gè)抽象類(含有純虛函數(shù)的類)。下面是一個(gè)接口的簡(jiǎn)單定義:第六頁(yè),共四十三頁(yè),編輯于2023年,星期日7與COM有關(guān)的概念(2)InterfaceIdeposit:Iunknown{virtualHRESULTGetMoney(int*nMoney)=0;};Iunknown接口很重要,其定義如下:StructIunknown{virtualHRESULTQueryInterface(REFIDiid,void**ppvobj)=0;//查詢是否支持接口virtualULONGAddRef()=0;//引用計(jì)數(shù)加1virtualULONGRelease()=0;//引用計(jì)數(shù)減1}第七頁(yè),共四十三頁(yè),編輯于2023年,星期日8與COM有關(guān)的概念(3)3.類與類工廠

類是COM接口的實(shí)現(xiàn),所有的COM對(duì)象都是COM類的實(shí)例。一個(gè)COM類也是用一個(gè)GUID來(lái)標(biāo)識(shí),在類中稱它為“類標(biāo)識(shí)符”(CLSID:ClassIdentifier)。每個(gè)類也有一個(gè)字符串名稱,叫做“編程標(biāo)識(shí)符”.4.組件

組件就是實(shí)現(xiàn)了指定接口并被封裝在DLL或可執(zhí)行文件中的軟件模塊,它能夠?qū)崿F(xiàn)由接口指定的功能,主要用來(lái)創(chuàng)建COM對(duì)象的。一個(gè)組件包括該COM類和實(shí)現(xiàn)該類工廠的程序代碼,有時(shí)也稱它為“服務(wù)器”。一個(gè)組件可以包括多個(gè)COM對(duì)象,每個(gè)COM對(duì)象可以實(shí)現(xiàn)多個(gè)接口。

第八頁(yè),共四十三頁(yè),編輯于2023年,星期日9與COM有關(guān)的概念(4)

5.注冊(cè)與注冊(cè)表組件編好之后,編譯出來(lái)的DLL文件還必須在注冊(cè)表中注冊(cè)后才能被其它用戶使用。因?yàn)橹挥羞@樣,用戶在創(chuàng)建COM對(duì)象時(shí),系統(tǒng)才能在注冊(cè)表中獲取相應(yīng)對(duì)象的位置,才能創(chuàng)建對(duì)象,對(duì)于DLL型的組件,需要調(diào)用RegSvr32.exe來(lái)完成,對(duì)于EXE型的組件,只要服務(wù)器運(yùn)行過(guò)一次,該組件就會(huì)自動(dòng)進(jìn)行注冊(cè)。返回

第九頁(yè),共四十三頁(yè),編輯于2023年,星期日101.4 ATL簡(jiǎn)介

ATL(ActiveXTemplateLibrary,活動(dòng)模板庫(kù))是一套C++的模板庫(kù),利用它可以很方便地建立小型的、基于COM的組件,對(duì)COM組件的開發(fā)提供了最大限度的代碼自動(dòng)生成以及可視化的支持。模板是ATL的核心技術(shù)。1.什么是模板

模板(Template)是基于類型參數(shù)產(chǎn)生類和函數(shù)的一種機(jī)制。模板在不降低類型安全的基礎(chǔ)上,可以顯著地減少代碼量,增加代碼的靈活性。模板包括函數(shù)模板和類模板,本節(jié)只講類模板。2.類模板類是對(duì)問(wèn)題空間的抽象,而類模板則是對(duì)類的抽象,即更高層次上的抽象。使用類模板,可以指定操作于某個(gè)數(shù)據(jù)類型的一族類。在程序中,可以首先定義一個(gè)類模板,然后通過(guò)使用不同的實(shí)參生成不同模板類的對(duì)象。第十頁(yè),共四十三頁(yè),編輯于2023年,星期日11ATL簡(jiǎn)介(續(xù))類模板的定義方法為:template<class類型參數(shù)>class類名{

……};類模板的具體內(nèi)容與普通類沒(méi)有本質(zhì)的區(qū)別,只是其員中要用到類模板的類型參數(shù)。【例15-1】一個(gè)類模板實(shí)例。程序的主文件名為MyTemplate.cpp。第十一頁(yè),共四十三頁(yè),編輯于2023年,星期日122 利用ATL創(chuàng)建COM組件

本節(jié)以一個(gè)字符串處理的組件為例來(lái)闡述如何利用ATL來(lái)制作COM組件。編程的思路為:(1)在VC下創(chuàng)建一個(gè)ATL工程,并對(duì)工程的可選項(xiàng)進(jìn)行設(shè)置;(2)向工程中添加ATL對(duì)象,并對(duì)該對(duì)象進(jìn)行一些初始配置工作;(3)根據(jù)COM組件的功能,向新的ATL對(duì)象中加入新的接口定義,包括方法和事件的定義,并實(shí)現(xiàn)相應(yīng)的接口成員函數(shù);(4)編譯鏈接該工程,注冊(cè)COM組件;(5)編寫組件測(cè)試程序,驗(yàn)證組件的功能。第十二頁(yè),共四十三頁(yè),編輯于2023年,星期日13利用ATL創(chuàng)建COM組件目錄2.1 創(chuàng)建ATL應(yīng)用程序框架2.2 在工程中添加ATL對(duì)象2.3 在COM組件中添加方法2.4 ATL中的字符串?dāng)?shù)據(jù)類型2.5 編譯IDL并注冊(cè)COM組件

第十三頁(yè),共四十三頁(yè),編輯于2023年,星期日142.1 創(chuàng)建ATL應(yīng)用程序框架

1.在VC開發(fā)環(huán)境下,選擇File|New菜單,將彈出的New對(duì)話框切換到Projects選項(xiàng)卡后,選擇ATLCOMAppWizard項(xiàng),在Projectname編輯框中輸入MyCom工程名稱,并設(shè)置好工程所在的文件夾。如圖右圖所示。

第十四頁(yè),共四十三頁(yè),編輯于2023年,星期日15創(chuàng)建ATL應(yīng)用程序框架(續(xù))2.單擊“OK”按鈕,進(jìn)入圖2所示的選擇ATL組件類型對(duì)話框。

2選擇COM組件類型對(duì)話框第十五頁(yè),共四十三頁(yè),編輯于2023年,星期日16創(chuàng)建ATL應(yīng)用程序框架(續(xù)) ATL組件類型一共有三種:第一種是DLL類型;第二種是EXE類型;第三種是Service類型,它也是一個(gè)典型的進(jìn)程外組件。Service是Windows2000的一種應(yīng)用服務(wù),當(dāng)操作系統(tǒng)啟動(dòng)的時(shí)候,該Server自動(dòng)運(yùn)行。由于進(jìn)程外組件的執(zhí)行效率較低,我們選擇DLL類型的。選擇完后,按“Finish”按鈕,結(jié)束ATL創(chuàng)建組件的向?qū)刹襟E,最終在磁盤上生成了組件的框架代碼。表1列出了該工程中的主要文件的信息。第十六頁(yè),共四十三頁(yè),編輯于2023年,星期日17表1AppWizard生成的MyCom工程中的文件

return文件名文件說(shuō)明MyCom.cpp工程的主文件,其中有組件的接口函數(shù)和注冊(cè)函數(shù)MyCom.def工程的DLL模塊定義文件,它與前面講的DLL庫(kù)中的Def文件的含義相同MyCom.idl工程的接口定義語(yǔ)言文件,COM是靠接口定義語(yǔ)言來(lái)定義組件間、組件與客戶間的接口定義,它是COM組件的入口點(diǎn)MyCom.rc工程的資源文件,與別的MFC程序的資源文件類似Resouce.h工程的資源文件的頭文件,與別的MFC程序的resource.h類似Stdafx.h工程的標(biāo)準(zhǔn)頭文件,與別的MFC程序的stdafx.h類似Stdafx.cpp工程的標(biāo)準(zhǔn)實(shí)現(xiàn)文件,與別的MFC程序的stdafx.cpp類似Str.rgs工程的注冊(cè)腳本文件第十七頁(yè),共四十三頁(yè),編輯于2023年,星期日182.2 在工程中添加ATL對(duì)象1.選擇Insert|NewATLObject,彈出如圖3所示的對(duì)話框,從Objects列表框中選擇SimpleObject項(xiàng)后,單擊“Next”按鈕繼續(xù)。圖3插入一個(gè)基于ATL的COM類

前面已經(jīng)創(chuàng)建了一個(gè)MyCom工程,接下來(lái),使用VC的ATLObjectWizard工具,可以方便地往工程中添加ATL對(duì)象。第十八頁(yè),共四十三頁(yè),編輯于2023年,星期日192.2 在工程中添加ATL對(duì)象(續(xù))2.系統(tǒng)彈出一個(gè)ATLObjectWizardProperties對(duì)話框。在ShortName中輸入Str,在COClass編輯框中輸入StrCom,如圖4所示。注意在Name選項(xiàng)卡中,可以鍵入類與文件名。默認(rèn)情況在,ShortName名字是其它名字的詞根??梢圆唤邮漳J(rèn)的名字而鍵入自己的名稱。圖4窗口中的Class是對(duì)象所實(shí)現(xiàn)的類的名稱,CoClass為包含對(duì)象支持的一些接口的名稱,Interface為對(duì)象創(chuàng)建的接口名字,Type為有關(guān)注冊(cè)對(duì)象的描述性字符串,ProgID為容器所使用的名字以代替對(duì)象的CLSID。

圖4設(shè)置COM類的屬性第十九頁(yè),共四十三頁(yè),編輯于2023年,星期日202.2 在工程中添加ATL對(duì)象(續(xù))3.切換到圖5所示的Attribute選項(xiàng)卡,設(shè)置StrCom對(duì)象的屬性,如組件的線程模式、接口類以及是否支持聚集等屬性。我們使用系統(tǒng)的默認(rèn)屬性。單擊“OK”按鈕,就生成了一個(gè)StrCom組件對(duì)象。圖5設(shè)置組件對(duì)象的屬性圖第二十頁(yè),共四十三頁(yè),編輯于2023年,星期日212.3 在COM組件中添加方法

1.方法的添加進(jìn)入Workspace窗口的ClassView面板,在IStr接口上右擊鼠標(biāo),選擇AddMethod菜單項(xiàng)后,彈出如圖6所示的增加方法接口對(duì)話框,在MethodName編輯框中輸入FirstToUpper,在Parameters編輯框中輸入“[in]BSTRInData,[out]BSTR*OutData,[out,retval]long*result”后,按OK按鈕結(jié)束方法的添加。

圖6添加FirstToUpper方法第二十一頁(yè),共四十三頁(yè),編輯于2023年,星期日222.3 在COM組件中添加方法(續(xù))第一個(gè)參數(shù)為InData,它是具有“in”屬性的字符串變量,它是輸入?yún)?shù),代表欲轉(zhuǎn)換的字符串;第二個(gè)參數(shù)為outData,它是具有“out”屬性的字符串變量,它是輸出參數(shù),代表轉(zhuǎn)換完后的的字符串;第三個(gè)參數(shù)為result,它是具有“out”和“retval”屬性,意思是說(shuō)該參數(shù)是作為返回值來(lái)用的輸出參數(shù),其類型是指向長(zhǎng)整型的指針變量。此時(shí)用戶在ClassView中就可以看到Istr接口中的FirstToUpper的方法。如圖7所示。

圖7Istr接口的方法FirstToUpper第二十二頁(yè),共四十三頁(yè),編輯于2023年,星期日232.3 在COM組件中添加方法(續(xù))2.方法的實(shí)現(xiàn)在Workspace窗口的ClassView面板中,將類CStr展開,接著,再將該類中的Istr接口展開,雙擊方法FirstToUpper(char*source,char*destion),光標(biāo)定位到該類的實(shí)現(xiàn)文件處,在其中添加代碼。STDMETHODIMPCStr::FirstToUpper(BSTRInData,BSTR*OutData,long*result){ CComBSTRstrSource=InData;boolbMayUpper=true;//是否可以大寫的標(biāo)志

for(inti=0;i<strSource.Length();i++) { if(strSource[i]>='a'&&strSource[i]<='z'&&bMayUpper) { strSource[i]=strSource[i]-32; bMayUpper=false; } if(strSource[i]=='')bMayUpper=true; } return*result;}第二十三頁(yè),共四十三頁(yè),編輯于2023年,星期日242.4 ATL中的字符串?dāng)?shù)據(jù)類型

由于COM組件是跨平臺(tái)與開發(fā)語(yǔ)言的,利用ATL開發(fā)出來(lái)的組件在VB等別的開發(fā)工具下也可以使用。ATL中使用的是C++語(yǔ)言,別的開發(fā)工具所使用的語(yǔ)言和C++的數(shù)據(jù)類型是有區(qū)別的,那么在不同的語(yǔ)言之間如何進(jìn)行數(shù)據(jù)的交換呢?這要靠組件接口中提供的多語(yǔ)言通用類型的數(shù)據(jù)類型,規(guī)定通用類型也是COM組件的一個(gè)組成部分。第二十四頁(yè),共四十三頁(yè),編輯于2023年,星期日252.4 ATL中的字符串?dāng)?shù)據(jù)類型(續(xù))1.BSTR用COM技術(shù)來(lái)設(shè)計(jì)組件以及構(gòu)件系統(tǒng)時(shí),字符串常用BSTR來(lái)表示。BSTR是BASICString的簡(jiǎn)稱,常用于BASIC的編程中。該類型是包含長(zhǎng)度前綴的,以0結(jié)束的字符串,長(zhǎng)度前綴表示該字符串所包含的字節(jié)數(shù)。COM提供了一些API函數(shù)來(lái)管理BSTR。如SysAllocString()(創(chuàng)建并初始化一個(gè)字符串),SysAllocStringLen()(創(chuàng)建一個(gè)指定長(zhǎng)度的字符串),SysFreeString()(釋放一個(gè)字符串),SysReAllocString()(改變字符串的長(zhǎng)度),SysStringLen()(返回字符串的長(zhǎng)度)等。在VC客戶端一般調(diào)用SysAllocString()創(chuàng)建字符串,以[In]參數(shù)方式傳遞給組件中的方法,調(diào)用完成后用SysFreeString()來(lái)釋放字符串的緩沖區(qū)。

BSTRstr=SysAllocString(”areyouready?”);

HRESULThr=p->FirstToUpper(str);

SysFreeString(str);第二十五頁(yè),共四十三頁(yè),編輯于2023年,星期日262.4 ATL中的字符串?dāng)?shù)據(jù)類型(續(xù))2.CComBSTR

CComBSTR是ATL封裝的一個(gè)來(lái)使用BSTR數(shù)據(jù)類型的類,如果把BSTR看作各種語(yǔ)言都可以使用的共同數(shù)據(jù)類型的話,那么CComBSTR則就是在C++下操縱COM中的一個(gè)數(shù)據(jù)類型。

CComBSTR類中有一些重要的函數(shù),如Append()(增加一個(gè)字符串),AppendBSTR()(增加一個(gè)BSTR字符串),Copy()(返回成員變量m_str的值),Empty()(釋放成員變量m_str的值),Length()(返回BSTR的長(zhǎng)度)等。第二十六頁(yè),共四十三頁(yè),編輯于2023年,星期日272.5 編譯IDL并注冊(cè)COM組件1.IDL簡(jiǎn)介

COM接口通常用“接口定義語(yǔ)言”IDL來(lái)定義,IDL是一種類似于C++的語(yǔ)言,前一節(jié)設(shè)計(jì)了一個(gè)MyCom組件,下面是其接口MyCom.idl的內(nèi)容:2.編譯IDL

上述Mycom.idl文件我們并未編寫,這完全歸功于ATL工具,是它幫助我們自動(dòng)完成了IDL接口文件。前面在給組件中添加方法的過(guò)程中,向?qū)ё詣?dòng)完成了IDL文件。 切換到WorkSpace的FileView面板中,在MyCom.idl文件上右鍵單擊鼠標(biāo),選擇CompileMyCom.idl菜單項(xiàng),于是在磁盤上生成了接口定義文件對(duì)應(yīng)的二進(jìn)制文件Mycom.tlb。該文件中含有接口中所定義的方法的記錄,定義了組件的虛函數(shù)指針表。.tlb可以看作是二進(jìn)制的接口定義語(yǔ)言。第二十七頁(yè),共四十三頁(yè),編輯于2023年,星期日282.5 編譯IDL并注冊(cè)COM組件(續(xù))//MyCom.idl:IDLsourceforMyCom.dll//ThisfilewillbeprocessedbytheMIDLtoolto//producethetypelibrary(MyCom.tlb)andmarshallingcode.import"oaidl.idl";import"ocidl.idl"; [object, uuid(F1CDC043-28E4-44D0-A4A6-BB8654CD7C02), dual, helpstring("IStrInterface"), pointer_default(unique) ] interfaceIStr:IDispatch {[id(1),helpstring("methodFirstToUpper")]HRESULTFirstToUpper([in]BSTRInData,[out]BSTR*OutData,[out,retval]long*result);};[uuid(D30786A1-E559-43D4-A62B-9A9FA0C559B1), version(1.0), helpstring("MyCom1.0TypeLibrary")]第二十八頁(yè),共四十三頁(yè),編輯于2023年,星期日292.5 編譯IDL并注冊(cè)COM組件(續(xù))libraryMYCOMLib{ importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(9618DF64-B84E-43BF-8A9C-3634E6A9F88F), helpstring("StrClass") ] coclassStrCom { [default]interfaceIStr; };};第二十九頁(yè),共四十三頁(yè),編輯于2023年,星期日302.5編譯IDL并注冊(cè)COM組件(續(xù))3.注冊(cè)MyCom.dll要想讓用戶能夠“透明”地使用創(chuàng)建的組件,首先必須將該組件注冊(cè)。單擊Build|BuildMycom.dll菜單項(xiàng),VC編譯器將生成該組件文件MyCom.dll,并且自動(dòng)完成注冊(cè)。其中注冊(cè)的代碼在MyCom.cpp中。還有一種手工注冊(cè)組件的方法是利用RegSvr32.exe來(lái)進(jìn)行,請(qǐng)參閱1.3中的5小節(jié)注冊(cè)與注冊(cè)表的說(shuō)明。第三十頁(yè),共四十三頁(yè),編輯于2023年,星期日313 在VC和VB中使用COM組件內(nèi)容3.1調(diào)用COM組件的過(guò)程3.2在VC中創(chuàng)建COM組件客戶3.3在VB中使用COM組件

第三十一頁(yè),共四十三頁(yè),編輯于2023年,星期日323.1 調(diào)用COM組件的過(guò)程

Windows系統(tǒng)下有大量的組件可供使用,前面我們所創(chuàng)建的MyCom組件也注冊(cè)好了,因此也可以使用,使用COM組件過(guò)程是一個(gè)典型的客戶/服務(wù)器(Client/Server)方式。COM組件含有被調(diào)用的接口,它是提供服務(wù)的,因此是服務(wù)方。

Windows系統(tǒng)下的組件如同一大堆積木,不同的人建房子所使用的積木也不一樣,因此不同的人使用的COM組件也不一樣,但它們有共同的使用過(guò)程:首先客戶程序要獲取包含組件的服務(wù)器(如MyCom.dll就是提供了字符串轉(zhuǎn)化的服務(wù)器),然后讓服務(wù)器創(chuàng)建組組件相關(guān)聯(lián)的類工廠,再由類工廠實(shí)例化組件,最后通過(guò)接口來(lái)使用組件。第三十二頁(yè),共四十三頁(yè),編輯于2023年,星期日333.2 在VC中創(chuàng)建COM組件客戶1.打開上一節(jié)的MyCom工程后,選擇File|New菜單,將彈出的New對(duì)話框切換到Projects選項(xiàng)卡后,選擇MFCAppWizard(exe)項(xiàng),在Projectname編輯框中輸入ComClient工程名稱,并選擇AddToCurrentWorkspace單選擇按鈕。如圖8所示。圖8在MyCom工作區(qū)中添加MyComClient工程第三十三頁(yè),共四十三頁(yè),編輯于2023年,星期日343.2 在VC中創(chuàng)建COM組件客戶(2)2.單擊“OK”按鈕進(jìn)入向?qū)乱徊襟E,選擇單文檔應(yīng)用程序類型。完后按“Finish”按鈕生成ComClient工程(這是在一個(gè)工作區(qū)中包含兩個(gè)工程的情況)。

3.在對(duì)話框資源IDD_COMCLIENT_DIALOG中添加圖9所示的控件,這些控件的屬性如表2所示。圖9對(duì)話框界面設(shè)計(jì)第三十四頁(yè),共四十三頁(yè),編輯于2023年,星期日353.2在VC中創(chuàng)建COM組件客戶(3)控件類型屬性值對(duì)應(yīng)成員變量靜態(tài)文本控件IDIDC_STATIC

Caption源串

IDIDC_STATIC

Caption目標(biāo)串

編輯框控件IDIDC_EDIT1m_strSource

IDIDC_EDIT2m_strDestion按鈕控件IDIDOK

Caption退出

IDIDC_BUTTON1

Caption轉(zhuǎn)換

表2控件的屬性設(shè)置與對(duì)應(yīng)的成員變量設(shè)置

return第三十五頁(yè),共四十三頁(yè),編輯于2023年,星期日363.2在VC中創(chuàng)建COM組件客戶(4)

4.在工程中添加Istr類按CTR+W打開類向?qū)?duì)話框后,在當(dāng)前的工程中加入COM中的一個(gè)類。方法為在類向?qū)У腗essageMap選項(xiàng)卡下,單擊“AddClass”按鈕,彈出選項(xiàng)“FromaTypeLibrary”如圖10。單擊“FromaTypeLibrary”選項(xiàng),出現(xiàn)圖11的對(duì)話框,把Mycom.tlb選上,又出現(xiàn)圖12的對(duì)話框,把Istr類選上,按“OK”按鈕,這樣就把創(chuàng)建的MyCom.tlb中的類Istr加入到該工程中。

圖10從類型庫(kù)中增加類第三十六頁(yè),共四十三頁(yè),編輯于2023年,星期日373.2在VC中創(chuàng)建COM組件客戶(5)

返回

圖11選擇Mycom.tlb圖12選擇類型庫(kù)中的IStr類

第三十七頁(yè),共四十三頁(yè),編輯于2023年,星期日383.2 在VC中創(chuàng)建COM組件客戶(6)5.主要代碼(1)在應(yīng)用程序類的InitInstance()函數(shù)中增加初始化OLE的代碼

BOOLCComClientApp::InitInstance(){AfxEnableControlContainer();AfxOleInit();//初始化OLE……}(2)“轉(zhuǎn)換”按鈕的實(shí)現(xiàn)代碼voidCComClientDlg::OnButton1(){IStrm_string;if(!m_string.CreateDispatch("MyCom.str.1"))//初始化COM庫(kù)MessageBox("CreateUserInfoerror");UpdateData(true);//將前臺(tái)數(shù)據(jù)傳到后臺(tái)BSTRbstrDestion=SysAllocString(L"");m_string.FirstToUpper(m_strSource,&bstrDestion);//調(diào)用COM組件中的方法m_strDestion=bstrDestion;UpdateData(false); //將后臺(tái)數(shù)據(jù)傳到前臺(tái)}第三十八頁(yè),共四十三頁(yè),編輯于2023年,星期日393.3 在VB中使用COM組件

前面用ATL創(chuàng)建了一

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論