




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、COM元件之建立與進(jìn)階技術(shù)國立交通大學(xué)資訊科學(xué)系分散式系統(tǒng)實驗室 DCS Lab謝欣君 Hsin-Chun Hsieh1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh2OutlinekGUID、IID、CLSID、RegistrykClass FactorykContainment、AggregationkCOM Server in EXEkDispatch Interface、Automation 1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh3GUID、IID、CLSID、RegistrykGUID+是由Open Softw
2、are Foundation(OSF)的Universally Unique Identifiers(UUID)衍生而來+在時間及空間上皆具唯一性+由128 bits組成,其中48 bits 配給空間,60 bits配給時間+typedef struct GUID DWORD Data1; WORD Data2; WORD Data3; BYTE Data48;GUID;1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh4GUID、IID、CLSID、RegistrykIID、CLSID+所有的元件都會擁有不同的ID ,即使兩個元件實作了完全相同的一組介面,也必須
3、設(shè)定為不同的CLSID+如果為元件加入新的介面,並不需要變更CLSID ,可是如果元件的變更會影響現(xiàn)有程式的正常運作,那麼就必須設(shè)定新的CLSID+typedef GUID CLSID;typedef GUID IID;kRegistry+CLISD register in HKEY_CLASSES_ROOT1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh5GUID、IID、CLSID、Registry+STDAPI DllRegisterServer();STDAPI DllUnregisterServer();kProgID+一些語言(如VB)使用ProgI
4、D來辨識元件+ProgID不具唯一性+.+Version-independent ProgID、ProgIDHKEY_CLASSES_ROOTCLSID166769E1-88E8-11CF-A6BB-0080C7B2D682InprocServer32CLSID、ProgID Registry ArchitectureProgIDVersionIndependentProgIDHKEY_CLASSES_ROOTCLSIDCurVerHelicopter.TailRotor.1CLSIDTail Rotor SimulatorC:HelicopterTailRotor.dllHelicopter
5、.TailRotor.1Helicopter.TailRotorTail Rotor SimulatorTail Rotor Simulator166769E1-88E8-11CF-A6BB-0080C7B2D682Helicopter.TailRotor.1166769E1-88E8-11CF-A6BB-0080C7B2D682ProgIDVersion-independent ProgID1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh7GUID、IID、CLSID、RegistrykComponent Category+一組特定的介面,並設(shè)有一個GUID,
6、稱CATID+如果元件實作了某元件種類中的所有介面,那該元件就可以登記為這個元件種類的一員+元件不但可以同時隸屬於多個元件種類,並可提供額外的介面kCOM 程式庫的初始化 OLE32.LIB OLE32.DLL HRESULT CoInitialize(void* reserved); void CoUninitialize();1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh8GUID、IID、CLSID、Registry+必須成對出現(xiàn)+in-proc(DLL)元件不需初始化程式庫,由EXE來管理+每個行程只需要初始化COM程式庫一次,叫用多次亦無妨,但須叫用
7、相同次數(shù)的CoUninialize1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh9Class FactorykClass Factory (類別工廠)+在COM中,所有的元件都是透過類別工廠來產(chǎn)生+也是一種元件,唯一的做用就是產(chǎn)生其它的元件+某一種特定的類別工廠可以用來產(chǎn)生特定CLSID所代表的元件,通常與元件放在同一個DLL中+標(biāo)準(zhǔn)介面IClassFactory+額外介面IClassFactory2O提供Authentication(驗證)機(jī)制,Client需傳入Key或使用許可憑證1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsi
8、eh10Class FactorykCoCreateInstance函式+可以用來產(chǎn)生元件。亦利用類別工廠來建立,只是方法較為一般化,所以缺乏彈性。+傳入一個CLSID,並傳回該元件的某個介面指標(biāo),一傳入的IID而定kCoGetClassObject函式+傳入一個CLSID,並傳回一個指向該CLSID類別工廠介面的指標(biāo)1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh11Class FactorykIClassFactory OInterface IClassFactory:Iunknown HRESULT _stdcall CreateInstance(Iunk
9、now* pUnknownOuter, const IID& iid, void* ppv); HRESULT _stdcall LockServer(BOOL bLock);+沒有CLSID傳入,所以每個類別工廠對應(yīng)到單一的CLSID1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh12Class FactorykCoGetClassObject的使用時機(jī)+當(dāng)需要透過IClassFactory以外的介面,如IClassFactory2+需要一次產(chǎn)生多個元件的時候,如果使用CoCreateInstance每產(chǎn)生一個元件就必須產(chǎn)生以及釋放類別工廠一次,缺乏效
10、率!k實作類別工廠+CoGetClassObject需要DLL中的一個特定函式(或說是一個進(jìn)入點,entry point),方能產(chǎn)生特定元件的類別工廠元件,此一函式便是DllGetClassObject1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh13Class Factory建立元件的過程ClientCOM LibraryDLLCoGetClassObjectDllGetClassObjectIClassFactoryIXCall CoGetClassObjectpIClassFactorypIX12436578Return IClassFactoryCal
11、ls IClassFactory:CreateInstanceReturn IXCalls IX:FxCreates Class FactoryCreates Component1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh14單一DLL包含多個元件ClientCall CoGetClassObjectDllGetClassObjectDLLClass Factory 1Class Factory nComponent 1Component n1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh15單一Class Factory提供
12、多種元件ClientCall CoGetClassObjectDllGetClassObjectDLLClass FactoryCLSID_1Component 1Component nCreateFunction_1CreateFunction_nCLSID_2&CreateFunction_1&CreateFunction_2&CreateFunction_nCLSID_n1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh16Containment & AggregationContainmentAggregationOuter
13、 CompenentOuter CompenentInner CompenentInner CompenentIXIYIYIYIXk克服COM不支援實作繼承之解決方案1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh17 COM Server in EXEk三種不同的行程狀態(tài)+in-process or in-proc (行程內(nèi)伺服器) - DLL+local server (本地端伺服器) Oout-of-process or out-of-proc (行程外伺服器) - EXE+remote server (遠(yuǎn)端伺服器)k讓介面能跨越行程,必需滿足下列條件+一
14、個行程必須能夠去叫用位於其他行程內(nèi)的函式+一個行程必須能夠?qū)①Y料傳遞給其他行程+用戶端程式不會因所使用的是行程內(nèi)或行程外的元件而必須有所改變1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh18COM Server in EXEkLocal Procedure Call,LPCkMarshaling+將參數(shù)從用戶端程式的位址空間中傳到元件所在行程的位址空間給所要叫用的函式,這個動作就叫做marshaling+IMarshal interfacekProxy/Stub DLLkIDL/MIDL+使用IDL(Interface Description Language
15、)語言來撰寫介面,再以MIDL編譯器幫我們產(chǎn)生proxy及stub DLL的程式1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh19Proxy/Stub DLLProcess boundaryClientComponentEXEEXEDLLDLLLocall procedure callStub unmarshalsparametersProxy marshalsparameters1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh20Automation機(jī)制kAutomation機(jī)制+可以讓直譯式或是巨集語言更容易地使用元件,也使
16、得利用這些語言來撰寫元件變得更簡單。+Automation機(jī)制改在執(zhí)行時期才做資料型別的檢查,以得到更大的彈性kAutomation Server+實作有Idispatch介面的COM元件kAutomation Controller+透過Idispatch介面跟Automation Server溝通的COM Client端程式1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh21IDispatchkIDispatch+GetTypeInfoCountO是否提供參數(shù)傳遞資訊+GetTypeInfoO取得參數(shù)傳遞有關(guān)資訊+GetIDsOfNamesO由可讀的metho
17、d name轉(zhuǎn)成DISPID+InvokeO負(fù)責(zé)叫用所有分派介面中的方法1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh22IDispatch+透過IDispatch這個單一的標(biāo)準(zhǔn)介面來提供所有的服務(wù)+巨集語言中的程式要叫用COM元件中的函式時,只擁有:ProgID、function name、function parameter三個資訊1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh23DispinterfacesIdispatch interfaceDispinterfacepVtbl&QueryInterface12
18、3“Foo”“Bar”“FooBar”123&Foo&Bar&FooBarDISPIDDISPIDNameFunction pointer&AddRef&Relase&GetTypeInfoCount&GetTypeInfo&GetIDsOfNames&InvokeGetIDsOfNamesfunctionInvokefunctionIDispatch*pIDispatch1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh24Dual InterfacepVtbl&QueryInterface123“Foo”“Bar”“FooBar”DISPIDName&AddRef&Relase&GetTypeInfoCount&GetTypeInfo&GetIDsOfNames&InvokeGetIDsOfNamesfunctionInvokefunctionIDispatch*pIDi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樓頂?shù)跹b字體施工方案
- 教師節(jié)感恩作文
- 2025年度校園心理安全責(zé)任協(xié)議書
- 2025年度智能化支付解決方案與服務(wù)合同
- 二零二五年度實習(xí)教師實習(xí)崗位工作職責(zé)合同
- 二零二五年度能源合同履約金管理及能源節(jié)約措施
- 二零二五年度農(nóng)村房產(chǎn)轉(zhuǎn)讓合同(附帶農(nóng)村土地經(jīng)營權(quán))
- 2025年度金融衍生品交易連帶責(zé)任保證合同
- 二零二五年度風(fēng)險評估與風(fēng)險控制合同
- 2025年度集體合同簽訂與產(chǎn)業(yè)工人隊伍建設(shè)
- 金融營銷實務(wù) 習(xí)題及答案 安賀新
- 焊接工藝基礎(chǔ)知識培訓(xùn)課件
- 南通大學(xué)開題報告模版
- DL∕T 1529-2016 配電自動化終端設(shè)備檢測規(guī)程
- 健身房管理制度前臺范文
- 2024年廣東深圳市中考英語試卷試題真題及答案(精校打印版)
- CJJ12-2013 家用燃?xì)馊紵骶甙惭b及驗收規(guī)程
- 2024天津工業(yè)職業(yè)學(xué)院教師招聘考試筆試試題
- QCT1067.5-2023汽車電線束和電器設(shè)備用連接器第5部分:設(shè)備連接器(插座)的型式和尺寸
- 合金固態(tài)相變?nèi)捉虒W(xué)課件
- 《研學(xué)旅行課程設(shè)計》課件-1研學(xué)課程資源選擇
評論
0/150
提交評論