入門-5.組件技術(shù)手記_第1頁(yè)
入門-5.組件技術(shù)手記_第2頁(yè)
入門-5.組件技術(shù)手記_第3頁(yè)
入門-5.組件技術(shù)手記_第4頁(yè)
入門-5.組件技術(shù)手記_第5頁(yè)
已閱讀5頁(yè),還剩395頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

關(guān)于本課軟件技術(shù)的發(fā)當(dāng)前軟件狀COM和CORBA簡(jiǎn)本課程的內(nèi)課程安關(guān)于本課展 軟件技提高軟件設(shè)計(jì)能軟件領(lǐng)域的發(fā)軟件需求的變軟件環(huán)境的變程序設(shè)計(jì)方法的發(fā)功能分解法——計(jì)算任 結(jié)構(gòu)化程序設(shè)計(jì)——以數(shù)據(jù)為中 面向?qū)ο蟪绦蛟O(shè)以對(duì)象為中心組件程序設(shè)計(jì)——以組件為中 軟件需求的變實(shí)管理軟件環(huán)境的變 多多任圖形界多線平臺(tái)相

單一語(yǔ)網(wǎng)絡(luò)(分布式)軟件開發(fā)模

OS+Compiler+

OS+Compilers++Libraries+++other經(jīng)發(fā)展變化的結(jié)不變因素回顧軟件學(xué)科10多年來的變 —混軟件的分發(fā)過程軟件工程對(duì)象技用一種新的思路來看待問三大特性:封裝性、繼承性、多態(tài)Object-Object-組件技組件技術(shù)適合于現(xiàn)代的軟件環(huán)組件可獨(dú)立發(fā)布要求“接口與實(shí)現(xiàn)分離組件infrastructure,組件體COM、CORBA(和中間件(middleware)市國(guó)內(nèi)的狀問題 C++之必要性 類是定義,它封裝了狀態(tài)和操對(duì)象是實(shí)例,它反映了具體的事對(duì)象由類來定概念:組定義:可獨(dú)立發(fā)布的二進(jìn)制單有的地方稱作容 例如概念:reuse(重用、復(fù)用不同形式的不同層次的例子概念:接口與實(shí)現(xiàn)分Interfaceand對(duì)象技術(shù)和組件技術(shù)都強(qiáng)接口是對(duì)象或者組件的通信協(xié)實(shí)現(xiàn)是對(duì)象或者組件的內(nèi)部細(xì)接口的發(fā)概念去是軟件設(shè)計(jì)的重 ,也是目不同層次上的對(duì)象技術(shù)中的重要概以一致的方式來看待不同的事在C++中,通過繼承和虛成員函數(shù)來實(shí)運(yùn)行時(shí)刻綁定:runtime在組件技術(shù)中,通過接口來體概念模不同層次上有不同的定有些操作與模塊相:模板函數(shù)模板和類模抽象層次更泛型技術(shù)(generic已納入C++標(biāo)準(zhǔn)之例子這是指軟件的結(jié)C/S是基多層結(jié)構(gòu)具有較好的靈活性和可擴(kuò)展多層結(jié)構(gòu)與基于組件的系統(tǒng)相結(jié)變種概念:其防 概軟件形單機(jī)軟Client/Server軟分布式軟 軟件的復(fù)雜度增軟件升級(jí)和更分布式軟件的發(fā)布和配軟件發(fā) 的問題(續(xù)Custom-madeversusstandard依賴于全才開發(fā)人軟件的可擴(kuò)展 如Web——〉發(fā)展組件軟件、軟件組軟件基礎(chǔ)設(shè)施的重要API的多樣軟件方案(solution),consulting市組件軟部分升增加了異構(gòu)軟件的可 動(dòng)態(tài)組合,提高軟件生產(chǎn)符合現(xiàn)代軟件的發(fā)展要軟件組關(guān)鍵:接口設(shè)對(duì)基礎(chǔ)設(shè)施的依內(nèi)部獨(dú)立設(shè)計(jì)、獨(dú)立開獨(dú)立發(fā)布、獨(dú)立測(cè)COM(ComponentObjectCORBA(CommonObjectRequestBrokerCOM:組件對(duì)象模建立在二進(jìn)制層次上的標(biāo)COM規(guī)COM實(shí)COM特語(yǔ)言無 進(jìn)程透明——〉位置透inprocserver、out-of-proc多線程特可擴(kuò)展COM:接COM接口特性COMCOM對(duì)象特性COM:組進(jìn)程內(nèi)組Export進(jìn)程外組COM:進(jìn)程內(nèi)組Inproc–Export客客 組COM:進(jìn)程外組Out-of-proc客客運(yùn)行提供DCE(客戶進(jìn)程

組運(yùn)行組提供DCE(組件進(jìn)程(組件進(jìn)程 組remote

DCEDCEDCECOM:組件信息發(fā)表工具和配置工 MTSExplorerCOM:創(chuàng)建COM對(duì)COMCOMCOM:COM對(duì)象管COM實(shí)現(xiàn)優(yōu)組件類component COM:COM體擴(kuò)展功COM:應(yīng)ActiveX功能擴(kuò)OLE其COM:分布式應(yīng) OLE集成Active CORBA規(guī)CORBA實(shí)現(xiàn)CORBA體系結(jié)CORBA:跨平臺(tái)、跨語(yǔ)多種平CORBA客ORB進(jìn)行通CORBA:對(duì)編寫IDLIDL-〉利用生成的stub類編寫客利用生成的impl類編寫服務(wù)器對(duì)CORBA字符串形式的GIOP(GeneralInter-ORBIIOP(InternetInter-ORB實(shí)現(xiàn)倉(cāng)庫(kù)、接口倉(cāng)CORBA:服命名服Trading事件服課程內(nèi)容(一準(zhǔn)備知課程內(nèi)容(二 課程內(nèi)容(三CORBA介中間插1-2次新技術(shù)報(bào)考核辦作考參考書《COM本質(zhì)論《COM原理與應(yīng)用《COM技 DesignPattern》或者《設(shè)計(jì)模式AdvancedCORBAProgrammingwithC++C++語(yǔ)言基 內(nèi)容簡(jiǎn)C++語(yǔ)言基C++之我掌握C++語(yǔ)言的基礎(chǔ)知操作系統(tǒng)的基礎(chǔ)知 計(jì)算機(jī)原編譯和執(zhí)行過許多概過過程

No結(jié)果正確? BuildmieCompile+如何對(duì)待錯(cuò)誤和警學(xué)會(huì)設(shè)置compileoptions和link

執(zhí)行過程Load、重定位、初始化、如何調(diào)程序?qū)Νh(huán)境的依賴C語(yǔ)言例voidmain(void{/*STRCPY.C:Thisprogramuses*andstrcattobuilda#include#include

charstrcpy(string," oworldfrom");strcat(string,"strcpy");strcat(string,"and");strcat(string,"strcat!");printf("String=%s\n",string}C語(yǔ)言特結(jié)構(gòu)簡(jiǎn)單的方法可以構(gòu)造復(fù)雜的結(jié)表達(dá)式靈活、簡(jiǎn)提供了一些接近匯編語(yǔ)言的功能及指適合于編寫系統(tǒng)軟件和工具軟件;指針非常靈調(diào)試方移植性目標(biāo)代碼小、效率C++語(yǔ)言內(nèi)數(shù)據(jù)類表達(dá)控制語(yǔ)函數(shù)(模板異常處常

數(shù)據(jù)類true、’a’、”filenameis變基本數(shù)據(jù)類void、charshortintlong、float、double、、指

數(shù)據(jù)類型(續(xù)一 字符const修飾類數(shù)據(jù)類型(續(xù)二 const定義常constintsize100;在size的有效范圍內(nèi)不可char*constaptrmybuf;*aptr=aptr=

合constchar*bptrmybuf;指向常量數(shù)*bptr=‘a(chǎn)’;bptr=yourbuf;

合constchar*constp=char*p 合法,例const也可以用在函數(shù)的參數(shù)說明在類的定義中intGetData( //不會(huì)改變對(duì)象的數(shù)數(shù)一維數(shù)intnumber[100];externintnumber[];數(shù)intnumber[100][10];externintnumber[][10];結(jié)構(gòu)數(shù)structfloatx,}結(jié)構(gòu)簡(jiǎn)單結(jié)struct{intyear,month,day;charmon[3];

結(jié)構(gòu)和嵌套結(jié)structphone{intareacode;longnumber; structphone; 結(jié)}Jim.number 結(jié)構(gòu)struct(續(xù)結(jié)構(gòu)中的位struct{unsigneda:4;unsignedb:5;unsignedc:7;}結(jié)構(gòu)中的成.操作Jim.number 聯(lián)合聯(lián)合類union{intival;floatfval;char*pval;MFC中典型的例子是VARIANT的定聯(lián)合與結(jié)構(gòu)的區(qū)內(nèi)存分配 方enum{枚舉sunday=0,枚舉型型}

缺省saturday指定sunday//monday=//tuesday=定義變量today為類型enumDaysyesterday;Daystomorrow;yesterday=monday;inti=tuesday;yesterday=0;yesterday=(Days)0;

C和C++C++合法i 例typedefcharFlagType;constFlagTypex;typedefint(FARWINAPI*FARPROC)();typedefint(WINAPI*PROC)();PROCintretVal=自定義變量的說

無名聯(lián)合、結(jié)例如structfruit{ char*name;union{DWORDcolor;struct{BYTEred;BYTEgreen;enumEnumDayday;structStructPointpoint;unionUnionColor

---------EnumDay---------StructPoint---------UnionColor

BYTE 指 intx,*px;px=&x;

pn表示緊接*p之后的第npn表示緊靠*p之前的第np1p2int**ppx表示指向int*

structdate 注意對(duì)pd一定要賦相當(dāng)

&x表示取x的地*px表示取px所指的變object.*pMember表 對(duì)象object的指針成pMenmber所指的變pobject->*pMember表 pobject所指對(duì)象的針成員pMenmber所指的變指針的轉(zhuǎn)換有很大的隨意性,但一定要保證安全

intx,*pa;pa=x=若有以下說struct{intx,*y}p-(++p)-*p-*(p-*p++-*(p++)-

x加 // y的內(nèi)容,再加同// y的內(nèi)容,后p加// y的內(nèi)容,后p加定義:void(PASCAL*pFunc)(int,賦值:pFunc調(diào)用:(*pFunc)(100,——int&r=指針變#include<stdio.h>voidswap(int*a,int*b){inttmp=*b=*a=tmp;}int{inti=7,j=3;swap(&i,&j);printf(“TheResultis:i=%d,““j=\n”,i,j);return}

#include<stdio.h>voidswap(int&a,int&b){inttmp=b;b=a;a=tmp;}int{inti=7,j=3;swap(i,j);printf(“TheResultis:i=%d,““j=\n”,i,j);return}變量類

例如,在某個(gè)函數(shù)內(nèi)部:autoint明:externint例如:staticint例如:registerintregistercharstaticinti**/externintTotal;intAdd(intx,inty){intz;/*externintTotal;*z=x+y;Total++;returnz;}intSub(intx,int{intz;/**/staticintSubTime0;z=x-y;returnz;}

變量類型例intTotal=intmain(){registerinti1,i2;/**/intResult1,Result2;i1=i2=Result1=Add(i1,i2);Result2=Sub(i1,printf(“i1=%d,i2=%d\n”,i1,i2);printf(“Result1=%d,Result2=%d\n”,Result1,Result2);return0;}new和分配內(nèi)在Cchar*name=(char*)malloc(Length+char*name=newchar[Length+釋放內(nèi)在C使用delete[]表達(dá)算術(shù)運(yùn)算 -++-關(guān)系運(yùn)算! 賦值運(yùn)算=條件運(yùn)算sizeof運(yùn)算

!= 表達(dá)式(續(xù)New、按位運(yùn)算、求反運(yùn) ^、~(求反移位運(yùn) 逗類型轉(zhuǎn)復(fù)合表達(dá)控制語(yǔ)if、return、表達(dá)式、for、continue、break、while、do-try、復(fù)合語(yǔ)逗號(hào)既可作分隔符,也可作運(yùn)算空操作語(yǔ)控制語(yǔ)句例if條件表達(dá)式if條件表達(dá)式)語(yǔ)句Aelse語(yǔ)句B把一組語(yǔ)句用if條件表達(dá)式)語(yǔ)句}表達(dá)式1表達(dá)式2表達(dá)式

switch(表達(dá)式) case表達(dá)式1:語(yǔ)}控制語(yǔ)句例子(續(xù)–while(表達(dá)式 語(yǔ)for(表達(dá)式 表達(dá)式賦初值結(jié)束條件dowhile表達(dá)式

boolFunc(intx,int說明:voidfunc(inta,intbint定義:調(diào)用 相當(dāng)于返回

函數(shù)(續(xù)一引出函數(shù)inlinevoidfunc(inta,int{printf(“%\na=%d,b=%d\n”,a,}extern函數(shù)(續(xù)二命令行參數(shù):intargccharextern調(diào)用參數(shù)處理 參數(shù)不確例如:intprintf(char*,函數(shù)指針定義函數(shù)指針函數(shù)(續(xù)三比如:#includeusingnamespace#includevoidprint(inti);voidprint(char*s);voidprint(int*p);void{函數(shù)例/*Functiondefinition*/voidwork(intnumber,long(*function)(inti){int longfor(i=j=0;i<number;i++)j+=(*function)(i);}

/*Functionprototypeslonglift(int),step(int),drop(int);voidwork(intnumber,long(*function)(inti));intselect, select=switch(select case1:work(count,lift);case2:work(count,step);case3:work(count,drop}}說明

變量說externintexternintglobal 定義函數(shù)說voidFunc(intx,int*隱含說*通常#include文件中包含的是函數(shù)的說struct{intx;int定

定變量定int函數(shù)定voidFunc(intx,inty)}

structPOINT{intx;intstructPOINT作用

local{}namespacenamespaceXXX}classscopeoperatorusingnamespace函數(shù)重

不能包含兩個(gè)extern重載版重載函數(shù)指函數(shù)模

例子template<classType>Typemin(Typea,Typeb){return}min(10.0,20.0);模板實(shí)例化——由參數(shù)決函數(shù)模板(續(xù)兩種編譯模模板特重載函數(shù)模異常處理(exception錯(cuò)誤處理機(jī)制、錯(cuò)誤代Throw(raise)anThrowTry、catch語(yǔ)句catch(type){}catch(type異常處理(續(xù)terminate來處Localobject正常析Catchall函數(shù)時(shí)指定函數(shù)可能的異intfunc(int)

預(yù)處理及其格式:#define符號(hào)名例如:#defineTRUE1

#define y%4==0&&y%100!=0#defineIS_LEAP_YEAR(y) 預(yù)處理及其他(續(xù)#ifdef

或者#ifndef標(biāo)識(shí) 或者

#ifdef \n \’ \xhhh對(duì)構(gòu)造函數(shù)與析構(gòu)函控制、友嵌套類中成員初始虛擬函類模類的定class{privateprotectedpublic

類的例class{COLORREFcolor;CShape(){color=0;}virtual~CShape(){}virtualvoidDisplay()=virtualvoidMoveTo(intx,inty)=構(gòu)造函

構(gòu)造函數(shù)和析構(gòu)函構(gòu)造函Copy構(gòu)造函構(gòu)造函數(shù)與析構(gòu)函數(shù)示CPoint*point1=newclassCPoint:public{privatePOINTCPoint(constCPoint&);CPoint(intx,inty);voidSetPoint(POINT);voidDisplay();voidMoveTo(intx,int

deleteCPoint*point2=newCPoint(100,delete{CPointCPoint 類的實(shí)

CPoint::CPoint(intx,int{m_point.x=x;m_point.y=}{}voidCPoint::SetPoint(POINT{m_point=}void{}voidCPoint::MoveTo(intx,int{m_point.x=x;m_point.y=}的classCPointintx,y;staticint…staticintintCPoint::nCount=intCPoint::GetCount(){returnnCount; 指向類成員的指例如:classCShape{intx,intwidth,…intintintpf=CShape::GetHeight;

////運(yùn)算符重

!,

>> [(deletenew[]比如operator=返 類型:return例雙目運(yùn)算符說明CComplexoperator+(CComplexcomplex)定義CComplexCComplex::operator+(CComplexcomplex){returnCComplex(x+complex.x,y+}使用Complexz1,z2,……初始z1和z2z3=z1+z2;單目運(yùn)算OperatorclassCPoint{operatorchar*();char*point=static_cast<char類指CComplexp=newCComplex(1,CComplexz1(10,10);p=&z1;

this指類成員 問特三種特友

classclass{intintgood();IOErrorclass{int{}int{}classBufferIO{public:enumIOError{none,General友class{Complex(floatre,floatim);friendComplexoperator+(Complexfirst,Complexsecondfloatreal,Complexoperator+(ComplexComplexsecond{returnfirst.real+second.real,first.imag+second.imag);}

class{friendclass//Declareafriendclassintclass{voidchange(MyClassmycvoidMyClassmyc{//可 } 板板 template<classT>class{template<classT>T&a,{Ttemp;temp=a;a=b=}

privateTpool[maxNum];intsp;voidPush(Tx);TPop();BOOLIsEmpty()BOOLIsFull()Stack<int>intStack;Stack<float>floatStack;模板(續(xù)inclusion模separation模式(export關(guān)鍵字partialspecializations)從面向過程轉(zhuǎn)換到面向?qū)νㄟ^數(shù)據(jù)結(jié)構(gòu)來描述具體的問題數(shù)據(jù)在功能(函數(shù))之間以參數(shù)的形式被傳送面向?qū)Χ鄳B(tài)性O(shè)bject-Oriented類的繼繼繼承生派生類特

派生classderived_class_name:private{…classderived_class_name:public{… int int int int charclass int intpublicparent charch; intnew1;classpublicinta;charch;intnew1;intintmethod1();intmethod2();intmethod3();(續(xù)二

//利用父類的構(gòu)造函數(shù)進(jìn)行初始derived::derived(intInit_a,charInit_ch,int:parent(Init_a,{new1=}:1基2內(nèi)嵌對(duì)派生

derived2::derived2(intInit_a,charInit_ch,intInit_new1,intInit_new2):derived(Init_a,Init_ch,{new2=}(續(xù)三

CShape*obj=newdelete如果不定義成virtual,則memory派生類類(續(xù)四)——多(續(xù)五

該調(diào)用特定的函數(shù),則必須冒號(hào)MyDerivedClass*p=new數(shù)多態(tài)性和虛擬擬數(shù)virtualvoid調(diào)用CShape*pShape=GetCurrentShape();純虛函定義:virtualvoidDisplay0404classAprivateintvalue;virtualvoidvirtualvoid

048對(duì)象的內(nèi)存048classB:pulicA{private:intvalue1;virtualvoidvirtualvoid

048對(duì)象的內(nèi)存048classB:pulicA{private:intvalue1;virtualvoid

classC{privateclassC{private:intvalue2;virtualvoidFunc3(void)virtualvoidclassD:publicC{private:intvirtualvoidclassE:publicB,publicD{private:intvalue4;virtualvoidFunc1(void)virtualvoidCACAEEDB048繼承關(guān)虛基類的構(gòu)造由themostderived類型轉(zhuǎn)voidDraw(CShape{//shape-//shape-if(dynamic_cast<CRect*>(shape))}C++標(biāo)準(zhǔn)iostreamostream&operator<<(ostream&os,constMyClass)istream&operator>>(istream&os,STL(StandardTemplateGenericSTLSTL數(shù)據(jù)類算 容STL容關(guān)聯(lián)容器(AssociativeSTL迭代 STL改變順序的操不改變順序的操排序及相關(guān)操常用的數(shù)字操使用#include<functional>#include<list>#include<iostream>#include<algorithm>usingnamespacestd;template<typenameT>voidprint_elements(T{cout<<elem<<"";void(*pfi)(int)=

void{intia[7]=list<int>ilist(ia,listfor_each(ilist.begin(),ilist.end(),//012345for_each(ilist.begin(),ilist.end(),pfi);//0123456707ilist.remove_if(bind2nd(modulus<int>(),for_each(ilist.begin(),ilist.end(),//0246}C++參考“DesignandEvolutionofC++”“C++ProgrammingLanguage”“C++Primer”(3/e)“InsidetheC++ObjectModel”“EffectiveC++”(2/e)“MoreEffectiveC++”“ExceptionalC++”“C++StrategiesandTactics”“GenericProgrammingandtheSTL” 組件的接COM接COMCOM對(duì)從歷史看OLE1COM又從OLE中脫穎而 COM基礎(chǔ)——幾個(gè)概COM對(duì)如何設(shè)計(jì)COM對(duì) 設(shè)計(jì)COM——從C++class{char*m_psz;CMyString(constchar*constchar*Find(constchar*psz);intLength();設(shè)計(jì)COM——從C++入手(續(xù):m_psz(newchar[psz?strlen(psz)+1:1]){if(psz)m_psz[0]=}delete[]m_psz;}constchar*CMyString::Find(constchar*psz){returnstrstr(m_psz,psz);}intCMyString::Length(){returnstrlen(m_psz);}C++類 靜靜 的缺 C++類 linking(續(xù)#ifdef#defineEXPORTORIMPORT動(dòng)動(dòng) 形

classEXPORTORIMPORT{CMyString(constchar*constchar*Find(constchar*psz);intLength();接口如 接 C++中類形式的接口存在的問若用VisualC++5.0/6.0客戶眼中的C++類(續(xù)如果是BorlandC++編譯器(4.02)命 解決方案命 解決方案模塊定義文件(.def)中給出序號(hào)別LIBRARYMYSTRING LIBRARYMYSTRING 命 解決方案C++類的vtable不隨編譯器而變vtable要求這些接口函數(shù)必須是虛函客戶如何得到C++對(duì)象的二進(jìn)制結(jié)new/delete是編譯器相關(guān)C++對(duì)象的二進(jìn)制結(jié)構(gòu)是編譯器相關(guān)C++對(duì)象與客戶之間的連接問方案1:句句柄方class{char*m_psz;CMyString(constchar*constchar*Find(constchar*psz);intLength();

classCMyString;classEXPORTORIMPORT{IMyString(constchar*constchar*Find(constchar*psz);intLength();案前提條件048虛函數(shù)048classB:pulicA{private:intvalue1;virtualvoidvirtualvoid

純虛基類方44{virtualconstchar*Find(constchar*psz)=0;virtualintLength()=0;

純虛接口的使用 #include客戶怎么使用

classCMyString:public{CMyString(constchar*constchar*Find(constcharint如何創(chuàng)建對(duì)DLL的唯一接口是引出函extern"C"_declspec(dllexport)IString*CreateString(constcharextern"C"IString*CreateString(constchar{returnnew}通過引出函數(shù)創(chuàng)建對(duì)extern"C"IString*CreateString(constcharvoidmain(){IString*p;p=CreateString(" if(p){constchar*psz=p->Find("llo");intn=p->Length();}#includevoidmain(){IString*p;HANDLEh=創(chuàng)if(NULL!=h)創(chuàng)PfnCreateStringpfn if(pfn)對(duì)p= 對(duì)if(p)constchar*psz=p-象intn=p-象}}//Becarefulaboutcalling}如何刪刪刪除后,所以比較好但是不能用可以讓對(duì)象自己把自己刪在IString中增加一個(gè)方class{virtualvoidvirtualconstchar*Find(constchar*psz)=0;virtualintLength()=0;classCMyString:public{char#includevoidmain(){IString*p;p=CreateString(" if(p){constchar*psz=p-intn=p->Length();}

CMyString(constchar*psz);virtual~CMyString();voidconstchar*Find(constchar*psz);intLength();voidCMyString::Delete(){deletethis;}小更高的要求對(duì)象的進(jìn)在原有接口的基礎(chǔ)上增加新的功能,例class{virtualvoidvirtualconstchar*Find(constchar*psz);virtualintLength();virtualcharFindAt(int對(duì)象的進(jìn)化(續(xù)完全增加新的功class{virtualvoidvirtualvoidSave(constchar*pszFile);virtualvoidLoad(constchar*pszFile);?接口的進(jìn)對(duì)象的接口不能發(fā)生變classIString2:public{virtualcharFindAt(int新對(duì)象實(shí)現(xiàn)兩個(gè)接口:IString2和 對(duì)象實(shí)現(xiàn)多個(gè)接atruntime,客戶可以靈活地從一個(gè)接口變換回憶RTTI(Runtimetype對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)一——robust對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)二class{virtualvoidvirtualvoid*Dynamic_cast(constchar*psz)=0;virtualconstchar*Find(constchar*psz)=0;virtualintLength()=0;classIString2:public{virtualcharFindAt(int對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)三classCMyString:publicvoid*CMyString::Dynamic_cast(constchar{ifreturnstatic_cast<IString*>(this);ifreturnstatic_cast<IString2*>(this);returnNULL;}對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)四#includevoidmain()IString*p=CreateString(" if(p){IString2constchar*psz=p->Find("llo");intn=p->Length();charc=p2->FindAt(3);}對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)五class{virtualvoidvirtualvoid*Dynamic_cast(constchar*psz)=0;virtualvoidSave(constchar*pszFile)=0;virtualvoidLoad(constchar*pszFile)=0;對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)六#includeclassCMyString:publicIString2,publicIPersistvoid*CMyString::Dynamic_cast(constchar*psz){if(strcmp(psz,"IString")==0)returnstatic_cast<IStringifreturnstatic_cast<IString2*>(this);ifreturnstatic_cast<IPersist*>(this);returnNULL;}對(duì)象實(shí)現(xiàn)多個(gè)接口(續(xù)七voidmain()IString*p=CreateString(" if(p){IString2*p2;IPersist*p3;constchar*psz=p->Find("llo");intn=p->Length();charc=p2->FindAt(3);}數(shù) 對(duì)象的生命周期管客戶可能擁有多個(gè)指向?qū)ο蟮模總€(gè)各有自己的lifetime outstandingreference未完結(jié) 對(duì)象的生命周期管理(續(xù) 記錄當(dāng)前outstandingreference的數(shù)目。戶時(shí)為1,以后由客戶管理,當(dāng)計(jì)數(shù)當(dāng)客戶通過獲得新的接口指針時(shí),引計(jì)數(shù)的兩個(gè)操我們用計(jì)數(shù)

class{virtualvoidvirtualvoid*Dynamic_cast(constchar*psz)=0;virtualvoidDuplicatePointer()=0;virtualconstchar*Find(constchar*psz)=0;virtualintLength()=0;class{virtualvoidvirtualvoid*Dynamic_cast(constchar*psz)=0;virtualvoidDuplicatePointer()=0;virtualvoidSave(constchar*pszFile)=0;virtualvoidLoad(constchar*pszFile)=0;#include

classCMyString:publicpublic{charCMyString(constchar*voidDestroyPointer();void*Dynamic_cast(constchar*);constchar*Find(constchar*psz);intLength();charFindAt(intvoidSave(constcharvoidLoad(constchar

:m_psz(newchar[psz?strlen(psz)+1:1]),m_refcount(0){if(psz)m_psz[0]=}if(0<m_refcount)m_refcount--deletethis;}}制void*CMyString::Dynamic_cast(constchar*psz)制void*p=ifp=static_cast<IString*>(this);ifp=static_cast<IString2*>(this);ifp=static_cast<IPersist*>(this);if(NULL!=p)returnp;}voidmain()IString*p=CreateString(" if(p){IPersist*p3;constchar*psz=p->Find("llo");intn=p->Length();charc=p2->FindAt(3);p2-}p3-}p-}修改創(chuàng)建函讓創(chuàng)建函數(shù)也正確 計(jì)extern"C"void*CreateString(constcharconstchar{void*pret=CMyString*p=newCMyString(psz);if(NULL!=p){if(NULL==pret)delete}return接口整每個(gè)接口都需要下面的三個(gè)函class{virtualvoid*DynamicCast(constchar*psz)=0;virtualvoidDuplicatePointer()=0;virtualvoidDll什么時(shí)候被卸載如何標(biāo)識(shí)一個(gè)接口?字符串線程安全如何標(biāo)識(shí)一個(gè)對(duì)象?對(duì)象 跨進(jìn)程?跨機(jī)器?對(duì)象環(huán)境COM接接口標(biāo)識(shí)——COM接口二進(jìn)制結(jié)COM接口的標(biāo)識(shí)——typedefstruct_GUIDextern"C"constGUIDCLSID_MYSPELLCHECKER{0x54bf6567,0x1007,}{0xb0,0xaa,0x44,0x45,0x54,0x00,0x00}}IUnknown接所有的COM接口都從IUnknown派C++定義class{virtual stdcallconstIID&iid,void**ppv)=0virtualULONGvirtual

stdcallAddRef()=0;stdcallRelease()=0;IUnknown接口(續(xù)C定義typedefstruct{HRESULT( RPC_FAR*

RPC_FAR*QueryInterface/*[in]*/REFIID/*[iidis][out]*/voidRPC_FAR* ULONG(STDMETHODCALLTYPE_RPC_FAR*AddRef)( RPC_FAR*ULONG(STDMETHODCALLTYPERPC_FAR*ReleaseIUnknownRPC_FAR*}interface{CONST_VTBLstructIUnknownVtblRPC_FAR對(duì)象實(shí)對(duì)象實(shí)C語(yǔ)言描述示例——structstruct{IDictionaryVtbl*struct{/*…QueryInterface,AddRef,Release*/BOOL(*Initialize)(IDictionary*this);BOOL(*LoadLibrary)(IDictionary*this,BOOL(*InsertWord)(IDictionary*this,String,String);void(*DeleteWord)(IDictionary*this,String);BOOL(*LookupWord)(IDictionary*this,String,String*);BOOL(*RestoreLibrary)(IDictionary*this,String);void(*FreeLibrary)(IDictionary*C++語(yǔ)言描述示例—classIDictionary:public{virtualBOOLInitialize()=virtualBOOLLoadLibrary(String)=0;virtualBOOLInsertWord(String,String)=0;virtualvoidDeleteWord(String)=0;virtualBOOLLookupWord(String,String*)=0;virtualBOOLRestoreLibrary(String)=0;virtualvoidFreeLibrary()=ULONGRelease();voidFreeLibrary(this*);CDictionaryCOMCDictionaryCOM接口的內(nèi)存模型(續(xù)一CDictionary類中COM接口的內(nèi)存模型(續(xù)二CDictionary類中虛函數(shù)的具體實(shí)另一個(gè)字典對(duì)象類中虛函數(shù)的具21接口查的途徑函數(shù)QueryInterface(iid用法返回值說明了對(duì)象對(duì)接口的支持情接口查詢用法示//loadtheretValue=pIDictionary->LoadLibrary("eng_ch.dict");if(retValue==FALSE) ISpellCheck*pISpellCheck;HRESULTresult(void**)&pISpellCheck);if(result!={pIDictionary->Release();return;//......useinterface//finally,releasedictionaryobjectpISpellCheck->Release(QueryInterface實(shí)與對(duì)象的定義有QueryInterface實(shí)現(xiàn)舉classCDictionary:publicIDictionary,public{publicpublic://IUnknownmember virtualHRESULTQueryInterface(constIID&iid, virtualULONGvirtualprivateintm_Ref

AddRef();Release()thisthis成員函IDictionaryIDictionaryvtable指ISpellCheckvtable指的屬性數(shù)HRESULTCDictionary::QueryInterface(constIID&void{if(iid==IID_IUnknown)*ppv=static_cast<IDictionary*>this;((IDictionary*)(*ppv))->AddRef();}elseif(iid==IID_Dictionary)*ppv=static_cast<IDictionary*>this;((IDictionary*)(*ppv))->AddRef();}elseif(iid==IID_SpellCheck)*ppv=static_cast<ISpellCheck*>this;((ISpellCheck*)(*ppv))->AddRef();}else*ppv=returnE_NOINTERFACE}return}COM對(duì)象的接口原IUnknown接口一致接口對(duì)稱接口自反接口傳遞接口查詢時(shí)間無關(guān)計(jì)目的:是為了控制對(duì)象的生命周多個(gè)客戶可以獨(dú)立地控制對(duì)象的生計(jì)數(shù)反映了被客 的個(gè)–Outstanding兩個(gè)操作:增一和減 實(shí) 計(jì)組件模 組 計(jì)數(shù)對(duì)象對(duì) 計(jì)

對(duì) 計(jì)數(shù)接 計(jì)

接 計(jì)

接 計(jì)

接 計(jì)實(shí) 計(jì)數(shù)三種方組件對(duì)象計(jì)數(shù)實(shí)現(xiàn)示classCDictionary:public{publicpublicQueryInterface(constIID&void**ppv)AddRef()Release()virtualBOOLInitialize();virtualBOOLLoadLibrary(String);//privatestructDictWord*m_pData;char*m_DictFilename[128];intm_Ref;計(jì)數(shù)實(shí)現(xiàn)示例(續(xù)CDictionary::CDictionary{m_Ref=//...}ULONGCDictionary::AddRef{m_Refreturn(ULONG)}ULONGCDictionary::Release{m_Ref--return(ULONG)}計(jì)數(shù)用客戶 接口時(shí)——增一操客戶用完接口時(shí)——減一操當(dāng)對(duì)象 計(jì)數(shù)為0時(shí),釋當(dāng)組件中所有對(duì)象 計(jì)數(shù)為0時(shí),卸AddRef和Release的返回值不可計(jì)數(shù)使用用示//loadthe示if(retValue==FALSE){}IDictionary*pIDictionaryForWord=pIDictionary;pIDictionaryForWord->AddRef();//InsertordeletesomewordpIDictionaryForWord->DeleteWord("...");pIDictionaryForWord->Release();//finally,releasedictionarypIDictionary->Release( 局部接口指針變類成員變使 計(jì)數(shù)數(shù)規(guī)則(一般性規(guī)優(yōu)計(jì)數(shù)問計(jì)數(shù)實(shí)現(xiàn)舉ULONGCDictionary::AddRef{m_Refreturn(ULONG)}ULONGCDictionary::Release{m_Ref--if(m_Ref==0{deletethis;return0;}return(ULONG)}總結(jié):COM接口特接口不變繼承性(擴(kuò)展性接口描述語(yǔ)言interfaceIDictionary:{HRESULTHRESULTLoadLibrary([in]HRESULTInsertWord([in]string,[in]string);HRESULTDeleteWord([in]string);HRESULTLookupWord([in]string,[out]string*);HRESULTRestoreLibrary([in]string);HRESULTIDL簡(jiǎn)基本數(shù)據(jù)類IUnknown接口的IDL描[local, ]interface{typedef[unique]IUnknown*LPUNKNOWN;HRESULTQueryInterface([in]REFIIDriid,[out,iid_is(riid)]void**ppvObject);ULONGAddRef();ULONG}IDL中類的描[helpstring("Aclass"),helpcontext(2481),appobject]coclass{[source]interfaceIMydocfuncs:IUnknown;dispinterfaceDMydocfuncs;IDL中庫(kù)的描[ o2.0TypeLibrary"),] {/*LibrarydefinitionstatementsIDL中l(wèi)ibrary示[object,uuid(...),<other]interfaceIKnown:{import<declarations,etc.forIKnowninterfacegohere>[<library]

library{//referenceinterfaceinterface//orcreateanewclass:<coclass]coclass{interfaceIDL的意MIDL.exe產(chǎn)生C++頭文件定MIDL.exe產(chǎn)生TLB類型描COM對(duì)包括屬性和方法,或者狀態(tài)和操能夠提供服務(wù)——通過COM接COM對(duì)象的標(biāo)識(shí)——?jiǎng)?chuàng)建對(duì)象的時(shí)候必須要提供COM對(duì)象封裝特可重用COM對(duì)象和接口圖今天講講講課內(nèi)容的參“COM原理及應(yīng)用”第二“COM技 ”前四“COM本質(zhì)論”第一、二“COM

自由作讀程 表組件接第一個(gè)里程 第二個(gè)里程 COM接接口標(biāo)class{virtual stdcallconstIID&iid,void**ppv)=0virtual stdcallAddRef()=virtual stdcallRelease()=對(duì)象實(shí)COM對(duì)象實(shí)COM 計(jì)計(jì)數(shù)的含Outstanding對(duì)象實(shí) 計(jì)客戶顯式 計(jì) 計(jì)數(shù)規(guī)COM接口 stdcallconstIID&iid,void一個(gè)COM對(duì)象可以實(shí)現(xiàn)多個(gè)接QueryInterface實(shí) 客戶通過QueryInterface使用對(duì)象的接編譯器:MIDL.exe產(chǎn)生C++頭文件定MIDL.exe產(chǎn)生TLB類型xxx_p.cxxx_p.cxxx_i.cxxx.hC++COM對(duì)封裝:屬性和方法,或者狀態(tài)和操對(duì)象與接口的聯(lián)實(shí)現(xiàn)形進(jìn)程內(nèi)組inprocess進(jìn)程外組outofprocess進(jìn)程內(nèi)組客戶:用到的API函數(shù),LoadLibrary說明進(jìn)程外組DLL(DLL(①應(yīng)用APIDLLLPC調(diào)用服務(wù)③服務(wù)f通過LPC返回結(jié)進(jìn)程外組件(續(xù)⑥對(duì)象返①客戶調(diào)用接口成

中中

②代理對(duì)象通DLLLPC

連接回顧:對(duì)象與與客戶戶之間連接客戶如何獲得第一個(gè)接口指如何創(chuàng)建(create)?激活客戶如 這個(gè)函數(shù)創(chuàng)建函方案創(chuàng)建函數(shù)(續(xù)該對(duì)象被稱為類對(duì)象,也稱為類現(xiàn)在問題是:如何創(chuàng)建類廠對(duì)客戶-〉引出函數(shù)-〉類廠對(duì)象-〉用戶對(duì)引出函數(shù)的名字固增加了一層間接性,帶來靈活}

類廠:用于創(chuàng) 對(duì)象 對(duì) 特殊性類廠(續(xù)字字典組類字典對(duì)多對(duì)象、多類廠組類廠對(duì)象創(chuàng)建類廠對(duì)llGetClassObject創(chuàng)建類廠對(duì)DllGetClassObjectHRESULTconstCLSID&clsid,constIID&iid,(void**)ppv創(chuàng)建函數(shù)哪信結(jié)果接口指IClassFactory接classIClassFactory:public{virtual stdcallconstIID&iid,void**ppv)=virtual stdcallBOOLbLock)=提供信息過程創(chuàng)建過程的位置透透位置透明性可以極大地方便客戶程如何做到位置透明解決方案COM方在Windows平臺(tái)上,使用系統(tǒng)表保在客戶與組件之間插入COM庫(kù),由庫(kù)完成創(chuàng)建的細(xì)節(jié)工Windows系 樹狀結(jié)根是“My KEY_CLASSES_ROOT\CLSIDTreeView組件 信TreeView{6B7E6392-850A-101B- 回顧:COM對(duì)象的標(biāo)例如{72d3edc2-a4c4-11d0-8533-ProgID:友好名,字符串形 TreeControl的ProgID信表其 工具RegEdit.exe、Regedt32、程 途徑:Win32ComponentCategories(組件類別組件類COM組件進(jìn)程內(nèi)組例如:RegSvr32 RegSvr32/u 進(jìn)程外組COM創(chuàng)建過 調(diào)用過COM建過類廠對(duì)象接口指COM創(chuàng)建一個(gè)類constCLSID&clsid,DWORDdwClsContext,COSERVERINFO*pServerInfo,constIID&iid,(voidHRESULTCoCreateInstance(constCLSID&clsid,DWORDdwClsContext,constIID&iid,(voidCoCreateInstance實(shí)現(xiàn)偽HRESULTCoCreateInstance(constCLSID&clsid,IUnknown*pUnknownOuter,DWORDdwClsContext,constIID&iid,void*ppv){IClassFactory*pCF; hr=CoGetClassObject(clsid,dwClsContext,NULL,IID_IClassFactory,(void*)pCF);ifreturnhr=pCF->CreateInstance(pUnkOuter,iid,(void*)ppv);return}HRESULTCoCreateInstanceEx(constCLSID&clsid,DWORDdwClsContext,COSERVERINFO*pServerInfo,DWORDdwCount,MULTI_QI個(gè)創(chuàng)建函數(shù)選用原 創(chuàng)建過程示意COM對(duì)組COM對(duì)組件程調(diào)用調(diào)用COM⑥

⑩⑦⑨②③⑤

⑧④classCDictionaryFactory:public{類 類廠CDictionaryFactory廠~CDictionaryFactory 實(shí)HRESULTQueryInterface(constIID&iid,void**ppv);ULONGAddRef();實(shí) ULONG//IClassFactoryHRESULTCreateInstance(IUnknown*,constIID&iid,void**ppv)HRESULTLockServer(BOOL);CreateInstanceHRESULT*pUnknownOuter,constIID&iid,void{CDictionary*pObj;HRESULThr;if(pUnknownOuter!=returnpObj=newif(pObj==NULL)return//Obtainthefirstinterfacepointer(whichdoesanhr=pObj->QueryInterface(iid,if(hr!={g_DictionaryNumber--;deletepObj;}return}DllGetClassObject的實(shí)extern"C"HRESULTstdcallDllGetClassObject(constCLSID&clsid,constIID&iid,void**ppv){if(clsid==CLSID_Dictionary)CDictionaryFactory*pFactory=newif(pFactory== returnE_OUTOFMEMORY}HRESULTresult=pFactory->QueryInterface(iid,return}elsereturn}} IClassFactory::LockServer函COMCOM庫(kù)的內(nèi)存管組件程序的裝載和卸COM用于創(chuàng)建過程的SCM(ServiceControl其COM成(續(xù)(COMclient)(COMserver)ServiceServiceControlManagerCOM庫(kù)的初始基本的初始化函數(shù)HRESULTCoInitialize(void 初始化之前唯一可以調(diào)用的函數(shù)DWORD另一個(gè)初始化函數(shù)COM庫(kù)的終止函數(shù)void IsEqualGUID、IsEqualIID、CLSIDFromProgID、StringFromCLSID、StringFromIID、類COM存管HRESULTCoGetMalloc(DWORDdwMemContext,IMallocclassIMalloc:public{void*void*

Alloc(ULONGcb)=Realloc(void*pv,ULONGcb)=0;Free(void*pv)=0;GetSize(void*pv)=0;DidAlloc(void*pv)=0;HeapMinimize()=0;COM庫(kù)內(nèi)存管理用法(一 length=MAX_LENGTH;IMalloc*pIMalloc; if(hr!=S_OK)//returnif//returnpszText=COM庫(kù)內(nèi)存管理用法(二三個(gè)封裝函數(shù)void*CoTaskMemAlloc(ULONGcb);voidCoTaskMemFree(void*pv);voidCoTaskMemRealloc(void*pv,ULONGCOM庫(kù)內(nèi)存管理用法(三 length=MAX_LENGTH;IMalloc*pIMalloc; psz=CoTaskMemAlloc(length);if(NULL==psz)//returnpszText=COM庫(kù)內(nèi)管理用法(四WCHAR*pwProgID;charpszProgID[128];hResult=if(hResult!=S_OK) }wcstombs(pszProgID,pwProgID,128);載進(jìn)程內(nèi)組件的裝載–進(jìn)程外組件的裝進(jìn)程內(nèi)組件的卸進(jìn)程外組件的卸進(jìn)程內(nèi)組件客戶調(diào)用COM庫(kù)函數(shù)COM庫(kù)調(diào)用DLL組件的引出函HRESULTCOM庫(kù)中一些些常用數(shù)

COMCOM庫(kù)的版本號(hào)COM庫(kù)的初始化COM庫(kù)功能服務(wù)終止GUIDGUIDIIDCLSIDCLSID結(jié)構(gòu)形式把CLSID結(jié)構(gòu)形式轉(zhuǎn)化為字符串形式IID轉(zhuǎn)化為IID結(jié)構(gòu)形式把IID結(jié)構(gòu)形式轉(zhuǎn)化為字符串形式GUIDCOM創(chuàng)建COM對(duì)象,可指定多個(gè)接口或?qū)OM對(duì)象創(chuàng)建函內(nèi)存管理函HRESULT數(shù)據(jù)結(jié) 0類別碼:反映了函數(shù)調(diào)用結(jié)果的基本情操作操作#define8#define3#define1#define9#define7#define#define0#define#define4#define2#define類別Win32SDK的頭文件HRESULT(續(xù)FormatMessage函SUCCEEDED和FAILED常0。QueryInterfaceCOM進(jìn)程外組件與客戶的協(xié)作過定義必要的CLSID和IID實(shí)現(xiàn)COM對(duì) 實(shí)現(xiàn)類廠對(duì) 實(shí)現(xiàn)DllGetClassObject、(可選)實(shí)現(xiàn)兩 函進(jìn)程內(nèi)組件與客戶的協(xié)作過COM組件程序CLSIDclsidIClassFactory*pClf;IUnknown*pUnknown;"Dictionary.Object",NULL,(void

COM 表中查找字典COM庫(kù)在內(nèi)存中查找clsid組件if( p.dll還沒被裝入內(nèi)存{...\}DLL ...\}DLL創(chuàng)建類廠對(duì)象COMIClassFactoryCOMIClassFactory接口客戶pClf->CreateInstance(NpClf->CreateInstance(NIID_IUnknown,(void**)&pUnknown);類廠對(duì)象的CreateInstance函數(shù)被調(diào)用(通過組件的vtable被客戶直接調(diào)用)用new操作符構(gòu)造字典組件對(duì)象newCDictionary;返回IUnknown接口指針客戶使用字典組件,通過其接口進(jìn) ppClf->Release();pUnknown->Release();CoFreeUnusedCoFreeUnused組件對(duì)象的Release函數(shù)被調(diào)(也是通過組件的vtable)if(m_Ref==0){deletethis;return0;}COMCOM庫(kù)調(diào)用字典組件的引出函數(shù)DllCanUnloadDllCanDllCanUnloadNow函數(shù)中:if不存在字典對(duì)象&&鎖計(jì)數(shù)器為0)returnTRUE;returnCoCoUninitialize()if(字典組件DllCanUnloadNow數(shù)返回TRUE)CoFreeLibrary(...);COMCOM庫(kù)釋放資源客戶程序退出客戶程序退出進(jìn)程外組件與客戶的協(xié)作過 COMCOM組件程序CLSIDclsidIClassFactory*pClf;IUnknown*pUnknown;"...",(void**)&pClf);

COM 表中組件對(duì)象COMclsidif(EXE||COM需要另一個(gè)實(shí)例{ 表中獲取EXE組件名}調(diào)用創(chuàng)建組件支持的各種調(diào)用COM調(diào)用COM所有類廠對(duì)象等組件完成后COM庫(kù)IClassFactory接口返回給客(void類廠對(duì)象的CreateInstance函數(shù)調(diào)用(通過進(jìn)程中 對(duì)象被構(gòu)造組件對(duì)IUnknown客戶使用字典組件,通過其接(間接)進(jìn) 組件對(duì)象的Release函數(shù)被調(diào)if(m_Ref=={deletethis;return0;}如果滿足退出條 常退客戶程序退

放的對(duì)象調(diào)用Release函數(shù)COM

CoUninitialize組件程序退自由作讀程 或者“Inside 復(fù)習(xí):對(duì)象創(chuàng)建過}

TreeView{6B7E6392-850A-101B- 復(fù)習(xí):類廠(Class 特殊性 復(fù)習(xí):類廠(續(xù)字字典組類字典對(duì)多對(duì)象、多類廠組類廠對(duì)象復(fù)習(xí):COM創(chuàng)建函復(fù)習(xí):COMCOM庫(kù)的初始COM庫(kù)的內(nèi)存管組件程序的裝載和卸常用函數(shù)和實(shí)現(xiàn)COM對(duì) 實(shí)現(xiàn)類廠對(duì) 實(shí)現(xiàn)DllGetClassObject、(可選)實(shí)現(xiàn)兩 函可重用性(reuse,復(fù)用COM重用模型:包容和聚C++類的重用模前提:假設(shè)有一個(gè)基類做法:兩種模classCNewClass:publicCOldClassC++類的兩種重用模COM重用模前提:假設(shè)有一個(gè)COM對(duì)象目標(biāo):實(shí)現(xiàn)一個(gè)新對(duì)象B,要求重用對(duì)象的功能,而不是重新實(shí)現(xiàn)原來已有的功做法:兩種模COM包容??蛻舫陶{(diào)調(diào)包容模型說外部對(duì)象的接口與內(nèi)部對(duì)象的接口可以不客戶看不到內(nèi)部對(duì)聚合模對(duì)象聚合模型說聚合對(duì)象和被聚合對(duì)象協(xié)同工客戶直接與內(nèi)部對(duì)象交互,但它并不知唯一性 的基本要重用針對(duì)某個(gè)接口而言,聚合和包容并,在一個(gè)對(duì)象上可以同時(shí)使聚合和包容的選擇策包容模型實(shí)定義接口classISomeInterface:public{virtualHRESULTstdcallSomeFunction()=classIOtherInterface:public{virtualHRESULTstdcallOtherFunction()=

classCB:publicISomeInterface,public{外部

CB(~CB

象定

HRESULT stdcallQueryInterface(constIID&iid,voidULONG stdcall stdcall//ISomeInterfacemembers stdcallSomeFunction();//IOtherInterfacemembersHRESULT stdcallOtherFunction();HRESULTprivateCB::CB({m_pSomeInterface=NULL;m_Ref=0;}CB::~CB({if(m_pSomeInterface!=}{HRESULTresult=::CoCreateInstance( CLSCTX_INPROC_SERVER,IID_ISomeInterface,(void**)&m_pSomeInterface);if(FAILED(result)) returnS_OK;}HRESULT stdcallCB::SomeFunction({}HRESULT_stdcallCB::OtherFunction({}constIID&iid,void{CB HRESULT if(pUnknownOuter!=NULL)returnCLASS_E_NOAGGREGATION;pObj=newCB();if(pObj==NULL)returnhr=pObj->Init();if(FAILED(hr)){deletepObj;}//Obtainthefirstinterfacepointer(whichdoesanAddRef)hr=pObj->QueryInterface(iid,ppv);return}包容:靈活應(yīng)用包容模HRESULT_stdcallCB::SomeFunction({if(...{return}{}}聚合實(shí)要點(diǎn):外部對(duì)象完全重用內(nèi)部對(duì)象的接關(guān)鍵在于外部對(duì)象的QueryInterface函 有兩個(gè)函數(shù)intFunc1(intx,inty){returnintFunc2(intx,inty){returnint(*MyFunc)(int,MyFunc=inta=MyFunc(10,MyFunc=intb=MyFunc(10,

classvirtualvoid stdcallMethod1(int,int)=0;virtualvoid stdcallMethod2(int)=0;classvirtual

stdcallOperator1(int,int)=virtual stdcallOperator2(int)=

classCMyObject:publicvirtualvoid stdcallMethod1(int,int);virtualvoid stdcallMethod2(int);實(shí)例化CMyObjectVtable1*p1=–指針類型并不

p1->Method1(a,Vtable2*p2=(Vtable2*)p1;p2->Operator1(a,b);回顧:聚合模對(duì)象classCB:public{ CB(對(duì)~CB對(duì)

象HRESULT stdcallQueryInterface(constIID&iid,void**ppv);ULONG stdcall象 stdcall義 stdcallOtherFunction()義HRESULTprivateIUnknown*m_pUnknownInner;//pointertoA'sHRESULTCB::QueryInterface(constIID&iid,void{if(iid==IID_IUnknown)*ppv=(IUnknown*)this;((IUnknown*)(*ppv))->AddRef()}elseif(iid==IID_OtherInterface)*ppv=(IOtherInterface*)this;((IOtherInterface*)(*ppv))->AddRef();}elseif(iid==IID_SomeInterface)returnm_pUnknownInner->QueryInterface(iid,ppv)}else*ppv=returnE_NOINTERFACE}return}對(duì)象對(duì)象 對(duì)象 接對(duì)對(duì)象外部對(duì)象客戶程對(duì)象委控點(diǎn)聚合模型的點(diǎn)如果pUnkOuter參數(shù)非NULL,并且外部對(duì)象請(qǐng)求(續(xù)這些要點(diǎn)指導(dǎo)我們?nèi)绾螌?shí)現(xiàn)聚合對(duì)HRESULTCoCreateInstance(constCLSID&IUnknownconstIID&iid,(voidHRESULTconstIID&iid,void兩

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論