當(dāng)前位置首頁 > 計(jì)算機(jī) > 編程與開發(fā)語言
搜柄,搜必應(yīng)! 快速導(dǎo)航 | 使用教程

COM組件編程基礎(chǔ)課件

文檔格式:PPT| 78 頁|大小 3.64MB|積分 20|2024-12-13 發(fā)布|文檔ID:253396717
第1頁
第2頁
第3頁
下載文檔到電腦,查找使用更方便 還剩頁未讀,繼續(xù)閱讀>>
1 / 78
此文檔下載收益歸作者所有 下載文檔
  • 版權(quán)提示
  • 文本預(yù)覽
  • 常見問題
  • 單擊此處編輯母版標(biāo)題樣式,,,*,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),,,,,,,,,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),,,*,§,10. 1 COM,簡介,一、什么是,COM,,COM,(,Component Object Model,): 組件對象模型,,其中:,1.,它定義了一套為構(gòu)建一個(gè)組件所必需遵循的規(guī)則或,者說它是一個(gè)說明如何建立可動(dòng)態(tài)交替更新組件的規(guī),范,該規(guī)范為客戶和組件提供保證能夠互操作應(yīng)該遵,循的標(biāo)準(zhǔn);,2.,它定義了組件和它們的客戶之間互相作用的方式采,用客戶進(jìn)程直接調(diào)用組件中的方法,使得組件和客戶,端無需任何中介組件就能互相聯(lián)系;,,3. COM,組件有可執(zhí)行代碼組成,即以二進(jìn)制代碼形,式重用,一般通過,DLL/EXE,形式發(fā)布,且通過,GUID,來保證每個(gè),COM,對象是全球唯一的§10. 1 COM簡介一、什么是COM,1,說明:,,1. COM,不是一類程序的擴(kuò)展名,也不是一種程序設(shè)計(jì),語言;,,2. COM,可利用,DLL,來給組件提供動(dòng)態(tài)鏈接的能力,但,COM,不是,DLL,;,,3. COM,可采用各種語言進(jìn)行編寫(語言無關(guān)性),同一,個(gè)軟件中不同組件可以使用不同的語言和工具開發(fā),;,,4. COM,是由,OLE,(對象連接與嵌入)技術(shù)發(fā)展而來,,COM,技術(shù)的目的是為開發(fā)、維護(hù)應(yīng)用程序提供高效靈,活手段,,說明:,2,二、,COM,服務(wù)器、,COM,對象、,COM,接口和函數(shù)的關(guān)系,,1.,一個(gè),COM,服務(wù)器(,DLL,或,EXE,)可以包含若干個(gè),COM,對象;,2.,一個(gè),COM,對象可以包含若干個(gè)接口;,3.,一個(gè)接口可以包含若干個(gè)函數(shù)。

    COM,服務(wù)器,,,,,,,,,,,COM,對象,1,,,,,,,,,,,接口,1,,,,,函數(shù),1,函數(shù),2,接口,2,,,函數(shù),1,,COM,對象,2,,,,,,,,,接口,1,,,,,,,函數(shù),1,函數(shù),2,函數(shù),3,二、COM服務(wù)器、 COM對象、COM接口和函數(shù)的關(guān)系COM,3,,IInterface_1,IInterface_2,COM,服務(wù)器,,,,,,,,,,,,接口對象,1,,,,,函數(shù),1,函數(shù),2,接口對象,2,,,函數(shù),1,IUnknown,說明:一般將,COM,對象表示為帶固定格式的圓形接頭,,每個(gè)接頭表示一個(gè)對外提供的接口,,IUnknown,接,口處首要地位,.,IInterface_1IInterface_2COM服務(wù)器,4,三、,接口,,1. COM,接口提供訪問對象的一種方式,應(yīng)用程序只能通過一個(gè)接,口指針訪問對象的函數(shù)COM,接口由一個(gè),全 局唯一標(biāo)識(shí)符,(,GUID,),IID,來區(qū)分和確定2.,所有,COM,接口都從,IUnknown,接口派生,struct IUnknown,{,virtual LONG QueryInterface( REFIID riid, void **ppv) = 0;,virtual ULONG AddRef( void) = 0;,virtual,ULONG,Release( void) = 0;,},,其中:,,⑴,,QueryInterface,通過接口標(biāo)識(shí)符,riid,查詢(確定)接口,返回,指向接口的指針的指針,同時(shí)調(diào)用,AddRef(),;,,⑵,AddRef,和,Release,用來管理對象接口被訪問的參數(shù)計(jì)數(shù)。

    調(diào)用這兩種方法的規(guī)則為:設(shè),N,為接口被訪問的計(jì)數(shù)器?,無論何時(shí)客戶接收到接口指針時(shí),必須調(diào)用,AddRef,:,N++,?,無論何時(shí)客戶完成使用接口指針時(shí),必須調(diào)用,Release,:,N- -,其目的是管理被使用的,COM,何時(shí)能夠被釋放:當(dāng),N=0,時(shí),三、接口,5,,UUID/GUID,:,Universally/Globals Unique IDentifiers,,通用,/,全局(球)唯一標(biāo)識(shí)符(,128,位,,16,字節(jié),,,,32,個(gè)字符),,GUID,的格式為:,“,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每個(gè),x,是,0-9,或,A-F,范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字例如:,97AD6FA3-8CAD-4068-90AE-320545A1E8C8,,即為有效的,GUID,值,CLSID,:,COM,類標(biāo)識(shí)符(,CLASS Identifiers,),LIBID,:類型庫標(biāo)識(shí)符(,type LIBrary Identifier,),IID,:接口標(biāo)識(shí)符(,Interface Identifiers,),ProgID,:,Programmer IDentifiers,,程序員給,CLSID,指定的一個(gè)程序員易記的名稱,根據(jù)約定,, ProgID,格式如下,:, . . ,IDL,:接口定義語言(,Interface Definition Language,),DCOM,:分布式組建對象模型(,Distributed Component Object Model,),,名詞解釋,UUID/GUID: Universally/Global,6,§,10. 2,基于,ATL,之,DLL,實(shí)現(xiàn),COM,,一、,ATL,簡介,,ATL,:活動(dòng)模版庫(,Active Template Liabrary,),它是為明確創(chuàng)建,COM,對象這個(gè)目的而提供的模版類庫,它提供了對幾個(gè)接,口的內(nèi)在支持,包括,IUnknown,、,IClassFactory,、,IDispatch,,,其中:,IClassFactory,(類工廠)是為訪問一個(gè),COM,服務(wù)器(,DLL,或,EXE,)中包含多個(gè),COM,對象中的接口對象提供的接口,類。

    IClassFactory,聲明如下:,,IClassFactory : public IUnknown,{,public:,virtual HRESULT STDMETHODCALLTYPE CreateInstance(,IUnknown *pUnkOuter,,REFIID riid,,void **ppvObject) = 0;,virtual HRESULT STDMETHODCALLTYPE LockServer(,BOOL fLock) = 0;,};,,說明:,IClassFactory,派生于,IUnknown,,因此它仍然支持標(biāo)準(zhǔn)的,,QueryInterface,的,COM,接口§10. 2 基于ATL之DLL實(shí)現(xiàn)COM 一、ATL簡,7,,IDispatch,(雙重接口)是為和其他語言兼容提供的接口類,,IDispatch,聲明如下:,,IDispatch : public IUnknown,{,public:,virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(,……,virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(,……,virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(,……,virtual HRESULT STDMETHODCALLTYPE Invoke(,/* [in] */ DISPID dispIdMember,,/* [in] */ REFIID riid,,/* [in] */ LCID lcid,,/* [in] */ WORD wFlags,,/* [out][in] */ DISPPARAMS *pDispParams,,/* [out] */ VARIANT *pVarResult,,/* [out] */ EXCEPINFO *pExcepInfo,,/* [out] */ UINT *puArgErr) = 0;,};,,說明:自定義(單)接口就是直接繼承,IUnknown,IDispatch(雙重接口)是為和其他語言兼容提供的接,8,二、利用,ATL,向?qū)Ы?COM,二、利用ATL 向?qū)ЫOM,9,注意本章使用,注意本章使用,10,步驟,1,:建立,ATL,項(xiàng)目,步驟1:建立ATL項(xiàng)目,11,COM組件編程基礎(chǔ)課件,12,COM組件編程基礎(chǔ)課件,13,說明:,,1.,允許合并代理,/,存根代碼,代理:是為遠(yuǎn)程過程調(diào)用將參數(shù)打包的一段代碼,存根:是在遠(yuǎn)程過程調(diào)用中將參數(shù)解包的一段代碼,如果你建立的,COM,(,DCOM,)需要遠(yuǎn)程訪問則選擇這,一項(xiàng)。

    2. COM + 1.0,,COM +,是微軟,COM,系統(tǒng)的最新版本且版本號(hào)是,1.0,,,“,+,”,表示對原,COM,的一些特征和服務(wù)進(jìn)行了改進(jìn)在某,些方面,簡化了某些與,COM,相關(guān)任務(wù)的屬性和服務(wù)3.,如果選擇服務(wù)器類型是,“,可執(zhí)行文件,(EXE),”,則不支持,,“,MFC,”,和,“,COM + 1.0”,,4.,如果選擇服務(wù)器類型是,“,服務(wù),(EXE),”,,,則,“,允許合并,代理,/,存根代碼,”,、,“,MFC,”,和,“,COM + 1.0”,均不支持,說明:,14,COM組件編程基礎(chǔ)課件,15,步驟,2,:添加一個(gè)接口類:,IClassOne,步驟2:添加一個(gè)接口類:IClassOne,16,在此處填寫“,IClassOne”,在此處填寫“IClassOne”,17,COM組件編程基礎(chǔ)課件,18,說明:,1.,線程模型,,?,單線程:所有選擇(標(biāo)記為)單一線程模型的接口對,象只能在一個(gè)線程上運(yùn)行,而且它不是別的,線程必須是所謂的主(,main,)線程?,單元:單元亦稱為公寓(,Apartment,),單元(公寓),是線程在內(nèi)存中運(yùn)行的區(qū)域,選擇,“,單元,”,就,表示除主線程單元外,還提供主線程單元之外,的(子)單元,而將建立的接口對象將來是在,子單元中運(yùn)行,即多個(gè)單元中的線程實(shí)例化的,多個(gè)接口對象將能夠并發(fā)運(yùn)行。

    ?,自由:和單線程類似只有一個(gè)主單元(公寓),但和,單線程不同的是在這惟一的單元中可以有多個(gè),線程在執(zhí)行?,兩者:單元,+,自由,2.,聚合:是一個(gè)外部對象暴露內(nèi)部對象接口的過程,,說明:1. 線程模型,19,再在接口類“,IClassOne”,中添加一個(gè),接口函數(shù)“,ILoginDlg”,再在接口類“IClassOne”中添加一個(gè),20,COM組件編程基礎(chǔ)課件,21,COM組件編程基礎(chǔ)課件,22,添加的接口函數(shù)如下:,添加的接口函數(shù)如下:,23,步驟,3,:向項(xiàng)目中添加對話框資源,步驟3:向項(xiàng)目中添加對話框資源,24,COM組件編程基礎(chǔ)課件,25,COM組件編程基礎(chǔ)課件,26,對話框進(jìn)行如下設(shè)置:,*****,對話框進(jìn)行如下設(shè)置: *****,27,使用類向?qū)Ыo,對話框資源“,IDD_LOGIN_DLG,”,配置類,“,CLoginD,ialog”,使用類向?qū)Ыo對話框資源“IDD_LOGIN_DLG”,28,COM組件編程基礎(chǔ)課件,29,步驟,4,:在接口函數(shù)中添加代碼,步驟4:在接口函數(shù)中添加代碼,30,編譯生成,COM,組建,查看發(fā)布文件,編譯生成COM組建查看發(fā)布文件,31,COM組件編程基礎(chǔ)課件,32,其中,DEF,文件中,4,個(gè)函數(shù)的作用是:,,?DllCanUnloadNow,當(dāng)調(diào)用結(jié)束時(shí)負(fù)責(zé)卸載,COM,?DllGetClassObject,,客戶程序通過它訪問,COM,,它創(chuàng)建由,CLSID,制定類型的對,象,該對象就是在客戶程序中調(diào)用,CoCreateInstance(),中請求對象,的類工廠。

    ?,DllRegisterServer,,在注冊表中注冊該,COM,組件(服務(wù)器),注意:當(dāng)在命令行中執(zhí)行,regsvr32,命令時(shí)調(diào)用該函數(shù),,例如:,regsvr32,,D:,\ComDll\ComDll\Debug\ComDll.dll,,?,DllUnregisterServer,從注冊表中卸載該,COM,組件(服務(wù)器),,注意:當(dāng)在命令行中執(zhí)行,regsvr32,命令時(shí)調(diào)用該函數(shù),,,例如:,regsvr32 -u,,D:\ComDll\ComDll\Debug\ComDll.dll,說明:,ATL,是自注冊的,即在生成,DLL,或,EXE,時(shí)自動(dòng)組冊,其中DEF文件中4個(gè)函數(shù)的作用是:,33,COM組件編程基礎(chǔ)課件,34,測試程序之建立,測試程序之建立,35,COM組件編程基礎(chǔ)課件,36,COM組件編程基礎(chǔ)課件,37,COM組件編程基礎(chǔ)課件,38,為“測試,ComOneDll”,菜單項(xiàng)添加消息映射函數(shù),為“測試ComOneDll”菜單項(xiàng)添加消息映射函數(shù),39,在函數(shù)中添加代碼,在函數(shù)中添加代碼,40,WINOLEAPI CoCreateInstance(,REFCLSID rclsid,,LPUNKNOWN pUnkOuter,,DWORD dwClsContext,,REFIID riid, //,接口標(biāo)識(shí)符,LPVOID FAR* ppv); //,返回指向借口函數(shù)的指針,其中:,API,函數(shù),CoCreateInstance,的作用是調(diào)用,COM,,返回指向接口,函數(shù)的指針。

    實(shí)際是負(fù)責(zé)調(diào)用,DEF,文件中給出的,,DllGetClassObject(),實(shí)例化組件對象 (類工廠)的函數(shù)? rclsid,:,DllGetClassObject(),函數(shù)用該類標(biāo)識(shí)符實(shí)例化組件對象,,? pUnkOuter,:,COM,的,IUnknown,,用,ATL,生成的,COM,取值,NULL,? dwClsContext,:表明,COM,服務(wù)器程序運(yùn)行所在的上下文,(,環(huán)境,),,這,個(gè)參數(shù)指定了包含被請求,COM,的服務(wù)器程序類型dwClsContext,取值范圍有,6,個(gè),在這里僅給出與我們編程有關(guān)的,3,個(gè),,CLSCTX_INPROC_SERVER,:,COM,服務(wù)器程序是一個(gè),DLL,,表明,COM,與客戶程序運(yùn)行在同一進(jìn)程中,CLSCTX_LOCAL_SERVER,:,COM,服務(wù)器程序是一個(gè),EXE,,表明,COM,程序運(yùn)行在一個(gè)單獨(dú)的進(jìn)程中,,CLSCTX_ALL,:代表任何一種均可以,API,函數(shù),CoCreateInstance,原形如下:,WINOLEAPI CoCreateInstance( 其,41,編譯、運(yùn)行結(jié)果,編譯、運(yùn)行結(jié)果,42,regsvr32 e:\ALTCOM08\AltToCom1\Debug\AltToCom1.dll,手工注冊,:,開始,─,?,運(yùn)行,regsvr32 e:\ALTCOM08\AltToCom1,43,§,10. 3,基于,ATL,之,EXE,文件實(shí)現(xiàn),COM,§10. 3 基于ATL之EXE文件實(shí)現(xiàn)COM,44,步驟,1,:建立,ATL,項(xiàng)目,步驟1:建立ATL項(xiàng)目,45,COM組件編程基礎(chǔ)課件,46,COM組件編程基礎(chǔ)課件,47,COM組件編程基礎(chǔ)課件,48,步驟,2,:向項(xiàng)目中添加對話框資源,步驟2:向項(xiàng)目中添加對話框資源,49,COM組件編程基礎(chǔ)課件,50,COM組件編程基礎(chǔ)課件,51,COM組件編程基礎(chǔ)課件,52,COM組件編程基礎(chǔ)課件,53,COM組件編程基礎(chǔ)課件,54,COM組件編程基礎(chǔ)課件,55,步驟,3,:構(gòu)造窗口類,首先向項(xiàng)目中添加一個(gè),C++,類,步驟3:構(gòu)造窗口類,56,COM組件編程基礎(chǔ)課件,57,在,MyWindow.h,文件中添加代碼構(gòu)造窗口類及關(guān)聯(lián)類,在MyWindow.h文件中添加代碼構(gòu)造窗口類及關(guān)聯(lián)類,58,COM組件編程基礎(chǔ)課件,59,COM組件編程基礎(chǔ)課件,60,在主函數(shù)(,main,)中添加利用,CMyWindow,類建立窗口的代碼,在主函數(shù)(main)中添加利用CMyWindow類建立窗口的,61,編譯(編譯后自動(dòng)運(yùn)行),編譯(編譯后自動(dòng)運(yùn)行),62,COM組件編程基礎(chǔ)課件,63,COM組件編程基礎(chǔ)課件,64,步驟,4,:在項(xiàng)目中添加一個(gè)接口類,步驟4:在項(xiàng)目中添加一個(gè)接口類,65,COM組件編程基礎(chǔ)課件,66,COM組件編程基礎(chǔ)課件,67,COM組件編程基礎(chǔ)課件,68,COM組件編程基礎(chǔ)課件,69,生成的接口函數(shù),生成的接口函數(shù),70,向接口函數(shù)中添加代碼,向接口函數(shù)中添加代碼,71,查看發(fā)布文件,查看發(fā)布文件,72,測試程序之建立,測試程序之建立,73,COM組件編程基礎(chǔ)課件,74,添加代碼,添加代碼,75,編譯、運(yùn)行,編譯、運(yùn)行,76,COM組件編程基礎(chǔ)課件,77,COM組件編程基礎(chǔ)課件,78,。

    點(diǎn)擊閱讀更多內(nèi)容
    最新文檔
    傳統(tǒng)文化道德不是高懸的明月而是腳下的星光.pptx
    世界無煙日關(guān)注青少年成長健康無煙為成長護(hù)航.pptx
    五四青年節(jié)詩詞贊歌五四青年自強(qiáng)不息.pptx
    XX學(xué)校班主任培訓(xùn)用心管理慧做班主任.pptx
    拒絕熬夜健康養(yǎng)生規(guī)律作息遠(yuǎn)離亞健康.pptx
    兒童成長手冊時(shí)光里的童真印記.pptx
    幼兒園夏季傳染病預(yù)防指南預(yù)見夏天健康童行夏季傳染病預(yù)防科普.pptx
    高中生心理健康教育主題班會(huì)快樂學(xué)習(xí)高效學(xué)習(xí)正視壓力學(xué)會(huì)減壓.pptx
    員工職業(yè)道德與職業(yè)素養(yǎng)培訓(xùn)遵守職業(yè)道德提高職業(yè)修養(yǎng).pptx
    2025職業(yè)病防治法宣傳周健康守護(hù)職防同行.pptx
    XX幼兒園防災(zāi)減災(zāi)安全教育臨災(zāi)不亂安全童行學(xué)會(huì)保護(hù)自己.pptx
    在2025年縣教育工作大會(huì)暨高考備考工作推進(jìn)會(huì)上的講話發(fā)言材料.docx
    在2025年縣全面從嚴(yán)治黨和黨風(fēng)廉政會(huì)議上的講話發(fā)言材料.docx
    在2025年全市慶?!拔逡弧濒邉趧?dòng)模范表彰大會(huì)上的講話發(fā)言材料多篇.docx
    2025年稅務(wù)局青年代表在五四青年座談會(huì)上的發(fā)言材料3篇.docx
    在2025年市委全體會(huì)議上的主持講話發(fā)言材料.docx
    2025年黨風(fēng)廉政建設(shè)工作要點(diǎn)材料.docx
    在2025年全市青年干部慶祝五四青年節(jié)大會(huì)上的講話發(fā)言材料多篇.docx
    在入黨積極分子培訓(xùn)班上的講話發(fā)言材料.docx
    縣文旅局黨組書記在五一假期及夏季旅游安全生產(chǎn)工作部署會(huì)議上的講話發(fā)言材料.docx
    賣家[上傳人]:20211108
    資質(zhì):實(shí)名認(rèn)證