版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
關于本課軟件技術的發(fā)當前軟件狀COM和CORBA簡本課程的內(nèi)課程安關于本課展 軟件技提高軟件設計能軟件領域的發(fā)軟件需求的變軟件環(huán)境的變程序設計方法的發(fā)功能分解法——計算任 結(jié)構化程序設計——以數(shù)據(jù)為中 面向?qū)ο蟪绦蛟O以對象為中心組件程序設計——以組件為中 軟件需求的變實管理軟件環(huán)境的變 多多任圖形界多線平臺相
單一語網(wǎng)絡(分布式)軟件開發(fā)模
OS+Compiler+
OS+Compilers++Libraries+++other經(jīng)發(fā)展變化的結(jié)不變因素回顧軟件學科10多年來的變 —混軟件的分發(fā)過程軟件工程對象技用一種新的思路來看待問三大特性:封裝性、繼承性、多態(tài)Object-Object-組件技組件技術適合于現(xiàn)代的軟件環(huán)組件可獨立發(fā)布要求“接口與實現(xiàn)分離組件infrastructure,組件體COM、CORBA(和中間件(middleware)市國內(nèi)的狀問題 C++之必要性 類是定義,它封裝了狀態(tài)和操對象是實例,它反映了具體的事對象由類來定概念:組定義:可獨立發(fā)布的二進制單有的地方稱作容 例如概念:reuse(重用、復用不同形式的不同層次的例子概念:接口與實現(xiàn)分Interfaceand對象技術和組件技術都強接口是對象或者組件的通信協(xié)實現(xiàn)是對象或者組件的內(nèi)部細接口的發(fā)概念去是軟件設計的重 ,也是目不同層次上的對象技術中的重要概以一致的方式來看待不同的事在C++中,通過繼承和虛成員函數(shù)來實運行時刻綁定:runtime在組件技術中,通過接口來體概念模不同層次上有不同的定有些操作與模塊相:模板函數(shù)模板和類模抽象層次更泛型技術(generic已納入C++標準之例子這是指軟件的結(jié)C/S是基多層結(jié)構具有較好的靈活性和可擴展多層結(jié)構與基于組件的系統(tǒng)相結(jié)變種概念:其防 概軟件形單機軟Client/Server軟分布式軟 軟件的復雜度增軟件升級和更分布式軟件的發(fā)布和配軟件發(fā) 的問題(續(xù)Custom-madeversusstandard依賴于全才開發(fā)人軟件的可擴展 如Web——〉發(fā)展組件軟件、軟件組軟件基礎設施的重要API的多樣軟件方案(solution),consulting市組件軟部分升增加了異構軟件的可 動態(tài)組合,提高軟件生產(chǎn)符合現(xiàn)代軟件的發(fā)展要軟件組關鍵:接口設對基礎設施的依內(nèi)部獨立設計、獨立開獨立發(fā)布、獨立測COM(ComponentObjectCORBA(CommonObjectRequestBrokerCOM:組件對象模建立在二進制層次上的標COM規(guī)COM實COM特語言無 進程透明——〉位置透inprocserver、out-of-proc多線程特可擴展COM:接COM接口特性COMCOM對象特性COM:組進程內(nèi)組Export進程外組COM:進程內(nèi)組Inproc–Export客客 組COM:進程外組Out-of-proc客客運行提供DCE(客戶進程
組運行組提供DCE(組件進程(組件進程 組remote
DCEDCEDCECOM:組件信息發(fā)表工具和配置工 MTSExplorerCOM:創(chuàng)建COM對COMCOMCOM:COM對象管COM實現(xiàn)優(yōu)組件類component COM:COM體擴展功COM:應ActiveX功能擴OLE其COM:分布式應 OLE集成Active CORBA規(guī)CORBA實現(xiàn)CORBA體系結(jié)CORBA:跨平臺、跨語多種平CORBA客ORB進行通CORBA:對編寫IDLIDL-〉利用生成的stub類編寫客利用生成的impl類編寫服務器對CORBA字符串形式的GIOP(GeneralInter-ORBIIOP(InternetInter-ORB實現(xiàn)倉庫、接口倉CORBA:服命名服Trading事件服課程內(nèi)容(一準備知課程內(nèi)容(二 課程內(nèi)容(三CORBA介中間插1-2次新技術報考核辦作考參考書《COM本質(zhì)論《COM原理與應用《COM技 DesignPattern》或者《設計模式AdvancedCORBAProgrammingwithC++C++語言基 內(nèi)容簡C++語言基C++之我掌握C++語言的基礎知操作系統(tǒng)的基礎知 計算機原編譯和執(zhí)行過許多概過過程
No結(jié)果正確? BuildmieCompile+如何對待錯誤和警學會設置compileoptions和link
執(zhí)行過程Load、重定位、初始化、如何調(diào)程序?qū)Νh(huán)境的依賴C語言例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語言特結(jié)構簡單的方法可以構造復雜的結(jié)表達式靈活、簡提供了一些接近匯編語言的功能及指適合于編寫系統(tǒng)軟件和工具軟件;指針非常靈調(diào)試方移植性目標代碼小、效率C++語言內(nèi)數(shù)據(jù)類表達控制語函數(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( //不會改變對象的數(shù)數(shù)一維數(shù)intnumber[100];externintnumber[];數(shù)intnumber[100][10];externintnumber[][10];結(jié)構數(shù)structfloatx,}結(jié)構簡單結(jié)struct{intyear,month,day;charmon[3];
結(jié)構和嵌套結(jié)structphone{intareacode;longnumber; structphone; 結(jié)}Jim.number 結(jié)構struct(續(xù)結(jié)構中的位struct{unsigneda:4;unsignedb:5;unsignedc:7;}結(jié)構中的成.操作Jim.number 聯(lián)合聯(lián)合類union{intival;floatfval;char*pval;MFC中典型的例子是VARIANT的定聯(lián)合與結(jié)構的區(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 注意對pd一定要賦相當
&x表示取x的地*px表示取px所指的變object.*pMember表 對象object的指針成pMenmber所指的變pobject->*pMember表 pobject所指對象的針成員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}變量類
例如,在某個函數(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[]表達算術運算 -++-關系運算! 賦值運算=條件運算sizeof運算
!= 表達式(續(xù)New、按位運算、求反運 ^、~(求反移位運 逗類型轉(zhuǎn)復合表達控制語if、return、表達式、for、continue、break、while、do-try、復合語逗號既可作分隔符,也可作運算空操作語控制語句例if條件表達式if條件表達式)語句Aelse語句B把一組語句用if條件表達式)語句}表達式1表達式2表達式
switch(表達式) case表達式1:語}控制語句例子(續(xù)–while(表達式 語for(表達式 表達式賦初值結(jié)束條件dowhile表達式
boolFunc(intx,int說明:voidfunc(inta,intbint定義:調(diào)用 相當于返回
函數(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ù)重
不能包含兩個extern重載版重載函數(shù)指函數(shù)模
例子template<classType>Typemin(Typea,Typeb){return}min(10.0,20.0);模板實例化——由參數(shù)決函數(shù)模板(續(xù)兩種編譯模模板特重載函數(shù)模異常處理(exception錯誤處理機制、錯誤代Throw(raise)anThrowTry、catch語句catch(type){}catch(type異常處理(續(xù)terminate來處Localobject正常析Catchall函數(shù)時指定函數(shù)可能的異intfunc(int)
預處理及其格式:#define符號名例如:#defineTRUE1
#define y%4==0&&y%100!=0#defineIS_LEAP_YEAR(y) 預處理及其他(續(xù)#ifdef
或者#ifndef標識 或者
#ifdef \n \’ \xhhh對構造函數(shù)與析構函控制、友嵌套類中成員初始虛擬函類模類的定class{privateprotectedpublic
類的例class{COLORREFcolor;CShape(){color=0;}virtual~CShape(){}virtualvoidDisplay()=virtualvoidMoveTo(intx,inty)=構造函
構造函數(shù)和析構函構造函Copy構造函構造函數(shù)與析構函數(shù)示CPoint*point1=newclassCPoint:public{privatePOINTCPoint(constCPoint&);CPoint(intx,inty);voidSetPoint(POINT);voidDisplay();voidMoveTo(intx,int
deleteCPoint*point2=newCPoint(100,delete{CPointCPoint 類的實
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;
////運算符重
!,
>> [(deletenew[]比如operator=返 類型:return例雙目運算符說明CComplexoperator+(CComplexcomplex)定義CComplexCComplex::operator+(CComplexcomplex){returnCComplex(x+complex.x,y+}使用Complexz1,z2,……初始z1和z2z3=z1+z2;單目運算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關鍵字partialspecializations)從面向過程轉(zhuǎn)換到面向?qū)νㄟ^數(shù)據(jù)結(jié)構來描述具體的問題數(shù)據(jù)在功能(函數(shù))之間以參數(shù)的形式被傳送面向?qū)Χ鄳B(tài)性Object-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ù)二
//利用父類的構造函數(shù)進行初始derived::derived(intInit_a,charInit_ch,int:parent(Init_a,{new1=}:1基2內(nèi)嵌對派生
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ù),則必須冒號MyDerivedClass*p=new數(shù)多態(tài)性和虛擬擬數(shù)virtualvoid調(diào)用CShape*pShape=GetCurrentShape();純虛函定義:virtualvoidDisplay0404classAprivateintvalue;virtualvoidvirtualvoid
048對象的內(nèi)存048classB:pulicA{private:intvalue1;virtualvoidvirtualvoid
048對象的內(nèi)存048classB:pulicA{private:intvalue1;virtualvoid
classC{privateclassC{private:intvalue2;virtualvoidFunc3(void)virtualvoidclassD:publicC{private:intvirtualvoidclassE:publicB,publicD{private:intvalue4;virtualvoidFunc1(void)virtualvoidCACAEEDB048繼承關虛基類的構造由themostderived類型轉(zhuǎn)voidDraw(CShape{//shape-//shape-if(dynamic_cast<CRect*>(shape))}C++標準iostreamostream&operator<<(ostream&os,constMyClass)istream&operator>>(istream&os,STL(StandardTemplateGenericSTLSTL數(shù)據(jù)類算 容STL容關聯(lián)容器(AssociativeSTL迭代 STL改變順序的操不改變順序的操排序及相關操常用的數(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對從歷史看OLE1COM又從OLE中脫穎而 COM基礎——幾個概COM對如何設計COM對 設計COM——從C++class{char*m_psz;CMyString(constchar*constchar*Find(constchar*psz);intLength();設計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動動 形
classEXPORTORIMPORT{CMyString(constchar*constchar*Find(constchar*psz);intLength();接口如 接 C++中類形式的接口存在的問若用VisualC++5.0/6.0客戶眼中的C++類(續(xù)如果是BorlandC++編譯器(4.02)命 解決方案命 解決方案模塊定義文件(.def)中給出序號別LIBRARYMYSTRING LIBRARYMYSTRING 命 解決方案C++類的vtable不隨編譯器而變vtable要求這些接口函數(shù)必須是虛函客戶如何得到C++對象的二進制結(jié)new/delete是編譯器相關C++對象的二進制結(jié)構是編譯器相關C++對象與客戶之間的連接問方案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)建對DLL的唯一接口是引出函extern"C"_declspec(dllexport)IString*CreateString(constcharextern"C"IString*CreateString(constchar{returnnew}通過引出函數(shù)創(chuàng)建對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)對p= 對if(p)constchar*psz=p-象intn=p-象}}//Becarefulaboutcalling}如何刪刪刪除后,所以比較好但是不能用可以讓對象自己把自己刪在IString中增加一個方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;}小更高的要求對象的進在原有接口的基礎上增加新的功能,例class{virtualvoidvirtualconstchar*Find(constchar*psz);virtualintLength();virtualcharFindAt(int對象的進化(續(xù)完全增加新的功class{virtualvoidvirtualvoidSave(constchar*pszFile);virtualvoidLoad(constchar*pszFile);?接口的進對象的接口不能發(fā)生變classIString2:public{virtualcharFindAt(int新對象實現(xiàn)兩個接口:IString2和 對象實現(xiàn)多個接atruntime,客戶可以靈活地從一個接口變換回憶RTTI(Runtimetype對象實現(xiàn)多個接口(續(xù)一——robust對象實現(xiàn)多個接口(續(xù)二class{virtualvoidvirtualvoid*Dynamic_cast(constchar*psz)=0;virtualconstchar*Find(constchar*psz)=0;virtualintLength()=0;classIString2:public{virtualcharFindAt(int對象實現(xiàn)多個接口(續(xù)三classCMyString:publicvoid*CMyString::Dynamic_cast(constchar{ifreturnstatic_cast<IString*>(this);ifreturnstatic_cast<IString2*>(this);returnNULL;}對象實現(xiàn)多個接口(續(xù)四#includevoidmain()IString*p=CreateString(" if(p){IString2constchar*psz=p->Find("llo");intn=p->Length();charc=p2->FindAt(3);}對象實現(xiàn)多個接口(續(xù)五class{virtualvoidvirtualvoid*Dynamic_cast(constchar*psz)=0;virtualvoidSave(constchar*pszFile)=0;virtualvoidLoad(constchar*pszFile)=0;對象實現(xiàn)多個接口(續(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;}對象實現(xiàn)多個接口(續(xù)七voidmain()IString*p=CreateString(" if(p){IString2*p2;IPersist*p3;constchar*psz=p->Find("llo");intn=p->Length();charc=p2->FindAt(3);}數(shù) 對象的生命周期管客戶可能擁有多個指向?qū)ο蟮?,每個各有自己的lifetime outstandingreference未完結(jié) 對象的生命周期管理(續(xù) 記錄當前outstandingreference的數(shù)目。戶時為1,以后由客戶管理,當計數(shù)當客戶通過獲得新的接口指針時,引計數(shù)的兩個操我們用計數(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ù)也正確 計extern"C"void*CreateString(constcharconstchar{void*pret=CMyString*p=newCMyString(psz);if(NULL!=p){if(NULL==pret)delete}return接口整每個接口都需要下面的三個函class{virtualvoid*DynamicCast(constchar*psz)=0;virtualvoidDuplicatePointer()=0;virtualvoidDll什么時候被卸載如何標識一個接口?字符串線程安全如何標識一個對象?對象 跨進程?跨機器?對象環(huán)境COM接接口標識——COM接口二進制結(jié)COM接口的標識——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對象實對象實C語言描述示例——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++語言描述示例—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ù)的具21接口查的途徑函數(shù)QueryInterface(iid用法返回值說明了對象對接口的支持情接口查詢用法示//loadtheretValue=pIDictionary->LoadLibrary("eng_ch.dict");if(retValue==FALSE) ISpellCheck*pISpellCheck;HRESULTresult(void**)&pISpellCheck);if(result!={pIDictionary->Release();return;//......useinterface//finally,releasedictionaryobjectpISpellCheck->Release(QueryInterface實與對象的定義有QueryInterface實現(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對象的接口原IUnknown接口一致接口對稱接口自反接口傳遞接口查詢時間無關計目的:是為了控制對象的生命周多個客戶可以獨立地控制對象的生計數(shù)反映了被客 的個–Outstanding兩個操作:增一和減 實 計組件模 組 計數(shù)對象對 計
對 計數(shù)接 計
接 計
接 計
接 計實 計數(shù)三種方組件對象計數(shù)實現(xiàn)示classCDictionary:public{publicpublicQueryInterface(constIID&void**ppv)AddRef()Release()virtualBOOLInitialize();virtualBOOLLoadLibrary(String);//privatestructDictWord*m_pData;char*m_DictFilename[128];intm_Ref;計數(shù)實現(xiàn)示例(續(xù)CDictionary::CDictionary{m_Ref=//...}ULONGCDictionary::AddRef{m_Refreturn(ULONG)}ULONGCDictionary::Release{m_Ref--return(ULONG)}計數(shù)用客戶 接口時——增一操客戶用完接口時——減一操當對象 計數(shù)為0時,釋當組件中所有對象 計數(shù)為0時,卸AddRef和Release的返回值不可計數(shù)使用用示//loadthe示if(retValue==FALSE){}IDictionary*pIDictionaryForWord=pIDictionary;pIDictionaryForWord->AddRef();//InsertordeletesomewordpIDictionaryForWord->DeleteWord("...");pIDictionaryForWord->Release();//finally,releasedictionarypIDictionary->Release( 局部接口指針變類成員變使 計數(shù)數(shù)規(guī)則(一般性規(guī)優(yōu)計數(shù)問計數(shù)實現(xiàn)舉ULONGCDictionary::AddRef{m_Refreturn(ULONG)}ULONGCDictionary::Release{m_Ref--if(m_Ref==0{deletethis;return0;}return(ULONG)}總結(jié):COM接口特接口不變繼承性(擴展性接口描述語言interfaceIDictionary:{HRESULTHRESULTLoadLibrary([in]HRESULTInsertWord([in]string,[in]string);HRESULTDeleteWord([in]string);HRESULTLookupWord([in]string,[out]string*);HRESULTRestoreLibrary([in]string);HRESULTIDL簡基本數(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中庫的描[ 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對包括屬性和方法,或者狀態(tài)和操能夠提供服務——通過COM接COM對象的標識——創(chuàng)建對象的時候必須要提供COM對象封裝特可重用COM對象和接口圖今天講講講課內(nèi)容的參“COM原理及應用”第二“COM技 ”前四“COM本質(zhì)論”第一、二“COM
自由作讀程 表組件接第一個里程 第二個里程 COM接接口標class{virtual stdcallconstIID&iid,void**ppv)=0virtual stdcallAddRef()=virtual stdcallRelease()=對象實COM對象實COM 計計數(shù)的含Outstanding對象實 計客戶顯式 計 計數(shù)規(guī)COM接口 stdcallconstIID&iid,void一個COM對象可以實現(xiàn)多個接QueryInterface實 客戶通過QueryInterface使用對象的接編譯器:MIDL.exe產(chǎn)生C++頭文件定MIDL.exe產(chǎn)生TLB類型xxx_p.cxxx_p.cxxx_i.cxxx.hC++COM對封裝:屬性和方法,或者狀態(tài)和操對象與接口的聯(lián)實現(xiàn)形進程內(nèi)組inprocess進程外組outofprocess進程內(nèi)組客戶:用到的API函數(shù),LoadLibrary說明進程外組DLL(DLL(①應用APIDLLLPC調(diào)用服務③服務f通過LPC返回結(jié)進程外組件(續(xù)⑥對象返①客戶調(diào)用接口成
中中
②代理對象通DLLLPC
連接回顧:對象與與客戶戶之間連接客戶如何獲得第一個接口指如何創(chuàng)建(create)?激活客戶如 這個函數(shù)創(chuàng)建函方案創(chuàng)建函數(shù)(續(xù)該對象被稱為類對象,也稱為類現(xiàn)在問題是:如何創(chuàng)建類廠對客戶-〉引出函數(shù)-〉類廠對象-〉用戶對引出函數(shù)的名字固增加了一層間接性,帶來靈活}
類廠:用于創(chuàng) 對象 對 特殊性類廠(續(xù)字字典組類字典對多對象、多類廠組類廠對象創(chuàng)建類廠對llGetClassObject創(chuàng)建類廠對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ǒng)表保在客戶與組件之間插入COM庫,由庫完成創(chuàng)建的細節(jié)工Windows系 樹狀結(jié)根是“My KEY_CLASSES_ROOT\CLSIDTreeView組件 信TreeView{6B7E6392-850A-101B- 回顧:COM對象的標例如{72d3edc2-a4c4-11d0-8533-ProgID:友好名,字符串形 TreeControl的ProgID信表其 工具RegEdit.exe、Regedt32、程 途徑:Win32ComponentCategories(組件類別組件類COM組件進程內(nèi)組例如:RegSvr32 RegSvr32/u 進程外組COM創(chuàng)建過 調(diào)用過COM建過類廠對象接口指COM創(chuàng)建一個類constCLSID&clsid,DWORDdwClsContext,COSERVERINFO*pServerInfo,constIID&iid,(voidHRESULTCoCreateInstance(constCLSID&clsid,DWORDdwClsContext,constIID&iid,(voidCoCreateInstance實現(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個創(chuàng)建函數(shù)選用原 創(chuàng)建過程示意COM對組COM對組件程調(diào)用調(diào)用COM⑥
⑩⑦⑨②③⑤
⑧④classCDictionaryFactory:public{類 類廠CDictionaryFactory廠~CDictionaryFactory 實HRESULTQueryInterface(constIID&iid,void**ppv);ULONGAddRef();實 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的實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庫的內(nèi)存管組件程序的裝載和卸COM用于創(chuàng)建過程的SCM(ServiceControl其COM成(續(xù)(COMclient)(COMserver)ServiceServiceControlManagerCOM庫的初始基本的初始化函數(shù)HRESULTCoInitialize(void 初始化之前唯一可以調(diào)用的函數(shù)DWORD另一個初始化函數(shù)COM庫的終止函數(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庫內(nèi)存管理用法(一 length=MAX_LENGTH;IMalloc*pIMalloc; if(hr!=S_OK)//returnif//returnpszText=COM庫內(nèi)存管理用法(二三個封裝函數(shù)void*CoTaskMemAlloc(ULONGcb);voidCoTaskMemFree(void*pv);voidCoTaskMemRealloc(void*pv,ULONGCOM庫內(nèi)存管理用法(三 length=MAX_LENGTH;IMalloc*pIMalloc; psz=CoTaskMemAlloc(length);if(NULL==psz)//returnpszText=COM庫內(nèi)管理用法(四WCHAR*pwProgID;charpszProgID[128];hResult=if(hResult!=S_OK) }wcstombs(pszProgID,pwProgID,128);載進程內(nèi)組件的裝載–進程外組件的裝進程內(nèi)組件的卸進程外組件的卸進程內(nèi)組件客戶調(diào)用COM庫函數(shù)COM庫調(diào)用DLL組件的引出函HRESULTCOM庫中一些些常用數(shù)
COMCOM庫的版本號COM庫的初始化COM庫功能服務終止GUIDGUIDIIDCLSIDCLSID結(jié)構形式把CLSID結(jié)構形式轉(zhuǎn)化為字符串形式IID轉(zhuǎn)化為IID結(jié)構形式把IID結(jié)構形式轉(zhuǎn)化為字符串形式GUIDCOM創(chuàng)建COM對象,可指定多個接口或?qū)OM對象創(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進程外組件與客戶的協(xié)作過定義必要的CLSID和IID實現(xiàn)COM對 實現(xiàn)類廠對 實現(xiàn)DllGetClassObject、(可選)實現(xiàn)兩 函進程內(nèi)組件與客戶的協(xié)作過COM組件程序CLSIDclsidIClassFactory*pClf;IUnknown*pUnknown;"Dictionary.Object",NULL,(void
COM 表中查找字典COM庫在內(nèi)存中查找clsid組件if( p.dll還沒被裝入內(nèi)存{...\}DLL ...\}DLL創(chuàng)建類廠對象COMIClassFactoryCOMIClassFactory接口客戶pClf->CreateInstance(NpClf->CreateInstance(NIID_IUnknown,(void**)&pUnknown);類廠對象的CreateInstance函數(shù)被調(diào)用(通過組件的vtable被客戶直接調(diào)用)用new操作符構造字典組件對象newCDictionary;返回IUnknown接口指針客戶使用字典組件,通過其接口進 ppClf->Release();pUnknown->Release();CoFreeUnusedCoFreeUnused組件對象的Release函數(shù)被調(diào)(也是通過組件的vtable)if(m_Ref==0){deletethis;return0;}COMCOM庫調(diào)用字典組件的引出函數(shù)DllCanUnloadDllCanDllCanUnloadNow函數(shù)中:if不存在字典對象&&鎖計數(shù)器為0)returnTRUE;returnCoCoUninitialize()if(字典組件DllCanUnloadNow數(shù)返回TRUE)CoFreeLibrary(...);COMCOM庫釋放資源客戶程序退出客戶程序退出進程外組件與客戶的協(xié)作過 COMCOM組件程序CLSIDclsidIClassFactory*pClf;IUnknown*pUnknown;"...",(void**)&pClf);
COM 表中組件對象COMclsidif(EXE||COM需要另一個實例{ 表中獲取EXE組件名}調(diào)用創(chuàng)建組件支持的各種調(diào)用COM調(diào)用COM所有類廠對象等組件完成后COM庫IClassFactory接口返回給客(void類廠對象的CreateInstance函數(shù)調(diào)用(通過進程中 對象被構造組件對IUnknown客戶使用字典組件,通過其接(間接)進 組件對象的Release函數(shù)被調(diào)if(m_Ref=={deletethis;return0;}如果滿足退出條 常退客戶程序退
放的對象調(diào)用Release函數(shù)COM
CoUninitialize組件程序退自由作讀程 或者“Inside 復習:對象創(chuàng)建過}
TreeView{6B7E6392-850A-101B- 復習:類廠(Class 特殊性 復習:類廠(續(xù)字字典組類字典對多對象、多類廠組類廠對象復習:COM創(chuàng)建函復習:COMCOM庫的初始COM庫的內(nèi)存管組件程序的裝載和卸常用函數(shù)和實現(xiàn)COM對 實現(xiàn)類廠對 實現(xiàn)DllGetClassObject、(可選)實現(xiàn)兩 函可重用性(reuse,復用COM重用模型:包容和聚C++類的重用模前提:假設有一個基類做法:兩種模classCNewClass:publicCOldClassC++類的兩種重用模COM重用模前提:假設有一個COM對象目標:實現(xiàn)一個新對象B,要求重用對象的功能,而不是重新實現(xiàn)原來已有的功做法:兩種模COM包容??蛻舫陶{(diào)調(diào)包容模型說外部對象的接口與內(nèi)部對象的接口可以不客戶看不到內(nèi)部對聚合模對象聚合模型說聚合對象和被聚合對象協(xié)同工客戶直接與內(nèi)部對象交互,但它并不知唯一性 的基本要重用針對某個接口而言,聚合和包容并,在一個對象上可以同時使聚合和包容的選擇策包容模型實定義接口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}包容:靈活應用包容模HRESULT_stdcallCB::SomeFunction({if(...{return}{}}聚合實要點:外部對象完全重用內(nèi)部對象的接關鍵在于外部對象的QueryInterface函 有兩個函數(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);實例化CMyObjectVtable1*p1=–指針類型并不
p1->Method1(a,Vtable2*p2=(Vtable2*)p1;p2->Operator1(a,b);回顧:聚合模對象classCB:public{ CB(對~CB對
象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}對象對象 對象 接對對象外部對象客戶程對象委控點聚合模型的點如果pUnkOuter參數(shù)非NULL,并且外部對象請求(續(xù)這些要點指導我們?nèi)绾螌崿F(xiàn)聚合對HRESULTCoCreateInstance(constCLSID&IUnknownconstIID&iid,(voidHRESULTconstIID&iid,void兩
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西省晉城市部分學校2024-2025學年高二上學期12月月考英語試卷(含答案無聽力原文及音頻)
- 江蘇省鹽城市潘黃實驗學校 蘇科版物理八年級上冊 八年級第一學期期末質(zhì)量檢測物 理(含答案)
- 河北省邢臺市部分高中2024-2025學年高三(上)期末物理試卷(含答案)
- 2024版海鮮干貨購銷合同范本
- 2024版辦公室保潔人員雇傭協(xié)議
- 2024精簡版聘用協(xié)議:高效規(guī)范格式版
- 福建省南平市劍津中學高一數(shù)學文月考試卷含解析
- 2024年一級造價師之建設工程技術與計量(交通)題庫含答案(a卷)
- 2024特色農(nóng)業(yè)產(chǎn)品銷售合同標的
- 2024版醫(yī)院合同管理規(guī)定
- 2025年四川長寧縣城投公司招聘筆試參考題庫含答案解析
- 2024年06月上海廣發(fā)銀行上海分行社會招考(622)筆試歷年參考題庫附帶答案詳解
- TSG 51-2023 起重機械安全技術規(guī)程 含2024年第1號修改單
- 計算機科學導論
- 浙江省杭州市錢塘區(qū)2023-2024學年四年級上學期英語期末試卷
- 《工程勘察設計收費標準》(2002年修訂本)
- 2024年一級消防工程師《消防安全技術綜合能力》考試真題及答案解析
- 2024-2025學年六上科學期末綜合檢測卷(含答案)
- 安徽省森林撫育技術導則
- 2023七年級英語下冊 Unit 3 How do you get to school Section A 第1課時(1a-2e)教案 (新版)人教新目標版
- 泌尿科主任述職報告
評論
0/150
提交評論