資源描述:
《Com對(duì)象的實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、COM對(duì)象的實(shí)現(xiàn)潘愛民2003-9-26http://www.icst.pku.edu.cn/CompCourse2003/內(nèi)容COM對(duì)象注冊(cè)表創(chuàng)建COM對(duì)象類廠COM對(duì)象的標(biāo)識(shí)——CLSID是GUID的一種用法創(chuàng)建對(duì)象的時(shí)候必須要提供CLSIDCOM對(duì)象的身份身份是否一致的可判斷性COM對(duì)象和接口圖示COM對(duì)象客戶的交互實(shí)體包括屬性和方法,或者狀態(tài)和操作能夠提供服務(wù)——通過COM接口對(duì)象的實(shí)現(xiàn)由組件完全包裝起來COM對(duì)象與C++對(duì)象的比較層次差異封裝特性可重用性多態(tài)性的表現(xiàn)形式不同接口描述語言:IDLinterfaceIDictionary:IUnknown{HRESU
2、LTInitialize();HRESULTLoadLibrary([in]string);HRESULTInsertWord([in]string,[in]string);HRESULTDeleteWord([in]string);HRESULTLookupWord([in]string,[out]string*);HRESULTRestoreLibrary([in]string);HRESULTFreeLibrary();};MIDL可以由IDL文件生成C/C++接口描述IDL簡介以O(shè)SFIDL為基礎(chǔ)基本數(shù)據(jù)類型與C語言非常接近,包括結(jié)構(gòu)、聯(lián)合、枚舉、typedef等
3、interfacecoclasslibrary可以產(chǎn)生類型庫IUnknown接口的IDL描述IDL接口定義:[local,object,uuid(00000000-0000-0000-C000-000000000046),pointer_default(unique)]interfaceIUnknown{typedef[unique]IUnknown*LPUNKNOWN;HRESULTQueryInterface([in]REFIIDriid,[out,iid_is(riid)]void**ppvObject);ULONGAddRef();ULONGRelease();}
4、IDL中類的描述[uuid(1e196b20-1f3c-1069-996b-00dd010fe676),version(1.0),helpstring("Aclass"),helpcontext(2481),appobject]coclassmyapp{[source]interfaceIMydocfuncs:IUnknown;dispinterfaceDMydocfuncs;};IDL中庫的描述[uuid(12345678-1234-1234-1234-123456789ABC),helpstring("Hello2.0TypeLibrary"),lcid(0x0409
5、),version(2.0)]libraryHello{/*Librarydefinitionstatements*/};IDL中l(wèi)ibrary示例[object,uuid(...),]interfaceIKnown:IUnknown{import"unknwn.idl";};[]libraryKnownLibrary{//referenceinterfaceIKnown:interfaceIKno
6、wn;//orcreateanewclass:[]coclassKnowMore{interfaceIKnown;};};IDL的意義IDL語言無關(guān)跨語言的中間語言MIDL.exe產(chǎn)生C++頭文件定義相當(dāng)于C++定義MIDL.exe產(chǎn)生TLB類型庫COM本身提供了一套基礎(chǔ)設(shè)施來解釋類型庫所有的標(biāo)準(zhǔn)接口都可以在SDK中找到IDL描述編譯IDLxxx.IDL文件MIDL.exexxx.hC++頭文件xxx_i.cGUIDxxx_p.cP/Sdlldata.cxxx.tlb用于客戶/服務(wù)器proxy/stub用于其他編程語言,如Java、V
7、BCOM對(duì)象實(shí)現(xiàn)形式進(jìn)程內(nèi)組件inprocesscomponent進(jìn)程外組件outofprocesscomponent進(jìn)程內(nèi)組件組件:做成DLL——引出函數(shù)客戶:用到的API函數(shù),LoadLibrary、GetProcAddress、FreeLibrary說明:1.也可以引出全局變量2.DumpBin檢查組件的引出函數(shù)和變量進(jìn)程外組件實(shí)現(xiàn)形式:EXEIPC:DDE、消息機(jī)制、共享內(nèi)存、RPC/LPC等等例:應(yīng)用調(diào)用系統(tǒng)服務(wù)進(jìn)程外組件(續(xù))回顧:對(duì)象與客戶之間的連接客戶通過vtable與對(duì)象進(jìn)行通信客戶如何獲得第一個(gè)接口指針?C