COM元件之建立与进阶技术_第1页
COM元件之建立与进阶技术_第2页
COM元件之建立与进阶技术_第3页
COM元件之建立与进阶技术_第4页
COM元件之建立与进阶技术_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、COM元件之建立與進階技術國立交通大學資訊科學系分散式系統實驗室 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、設定為不同的CLSID+如果為元件加入新的介面,並不需要變更CLSID ,可是如果元件的變更會影響現有程式的正常運作,那麼就必須設定新的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+一組特定的介面,並設有一個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+必須成對出現+in-proc(DLL)元件不需初始化程式庫,由EXE來管理+每個行程只需要初始化COM程式庫一次,叫用多次亦無妨,但須叫用

7、相同次數的CoUninialize1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh9Class FactorykClass Factory (類別工廠)+在COM中,所有的元件都是透過類別工廠來產生+也是一種元件,唯一的做用就是產生其它的元件+某一種特定的類別工廠可以用來產生特定CLSID所代表的元件,通常與元件放在同一個DLL中+標準介面IClassFactory+額外介面IClassFactory2O提供Authentication(驗證)機制,Client需傳入Key或使用許可憑證1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsi

8、eh10Class FactorykCoCreateInstance函式+可以用來產生元件。亦利用類別工廠來建立,只是方法較為一般化,所以缺乏彈性。+傳入一個CLSID,並傳回該元件的某個介面指標,一傳入的IID而定kCoGetClassObject函式+傳入一個CLSID,並傳回一個指向該CLSID類別工廠介面的指標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傳入,所以每個類別工廠對應到單一的CLSID1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh12Class FactorykCoGetClassObject的使用時機+當需要透過IClassFactory以外的介面,如IClassFactory2+需要一次產生多個元件的時候,如果使用CoCreateInstance每產生一個元件就必須產生以及釋放類別工廠一次,缺乏效

10、率!k實作類別工廠+CoGetClassObject需要DLL中的一個特定函式(或說是一個進入點,entry point),方能產生特定元件的類別工廠元件,此一函式便是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三種不同的行程狀態+in-process or in-proc (行程內伺服器) - DLL+local server (本地端伺服器) Oout-of-process or out-of-proc (行程外伺服器) - EXE+remote server (遠端伺服器)k讓介面能跨越行程,必需滿足下列條件+一

14、個行程必須能夠去叫用位於其他行程內的函式+一個行程必須能夠將資料傳遞給其他行程+用戶端程式不會因所使用的是行程內或行程外的元件而必須有所改變1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh18COM Server in EXEkLocal Procedure Call,LPCkMarshaling+將參數從用戶端程式的位址空間中傳到元件所在行程的位址空間給所要叫用的函式,這個動作就叫做marshaling+IMarshal interfacekProxy/Stub DLLkIDL/MIDL+使用IDL(Interface Description Language

15、)語言來撰寫介面,再以MIDL編譯器幫我們產生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機制kAutomation機制+可以讓直譯式或是巨集語言更容易地使用元件,也使

16、得利用這些語言來撰寫元件變得更簡單。+Automation機制改在執行時期才做資料型別的檢查,以得到更大的彈性kAutomation Server+實作有Idispatch介面的COM元件kAutomation Controller+透過Idispatch介面跟Automation Server溝通的COM Client端程式1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh21IDispatchkIDispatch+GetTypeInfoCountO是否提供參數傳遞資訊+GetTypeInfoO取得參數傳遞有關資訊+GetIDsOfNamesO由可讀的metho

17、d name轉成DISPID+InvokeO負責叫用所有分派介面中的方法1998/5/1NCTU CIS DCS Lab Hsin-Chun Hsieh22IDispatch+透過IDispatch這個單一的標準介面來提供所有的服務+巨集語言中的程式要叫用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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论