




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、126,十三. 自動(dòng)化對(duì)象,概念澄清: 類(lèi)型庫(kù)與自動(dòng)化接口Idispatch完全獨(dú)立 自動(dòng)化對(duì)象與自動(dòng)化控制完全獨(dú)立 命名的混亂 類(lèi)型庫(kù) IDispatch接口 自動(dòng)化對(duì)象的實(shí)現(xiàn) 使用自動(dòng)化對(duì)象客戶(hù) 晚綁定 DISPID綁定 早綁定、 自動(dòng)化對(duì)象編程實(shí)踐,226,1類(lèi)型庫(kù),COM不僅追求C+編譯器的中立,而且追求語(yǔ)言的獨(dú)立性. 因此它使用IDL語(yǔ)言來(lái)描述接口. 然后在IDL到具體的語(yǔ)言之間建立映射. 但是一些數(shù)據(jù)類(lèi)型在有些語(yǔ)言中難以表達(dá)。比如復(fù)雜的結(jié)構(gòu)類(lèi)型,指針類(lèi)型,函數(shù)指針等等在一些弱類(lèi)型的高級(jí)語(yǔ)言中比如Java, Visual Basic等等并沒(méi)有得到支持. IDL到這些語(yǔ)言的映射不能順利
2、地進(jìn)行. 客戶(hù)通過(guò)接口調(diào)用對(duì)象時(shí),在編譯時(shí)刻需要接口的準(zhǔn)確的描述, 這個(gè)描述正是來(lái)自于MIDL對(duì)IDL編譯后產(chǎn)生的頭文件, 而Java, VB等無(wú)法使用這種基于C/C+的頭文件. COM的語(yǔ)言無(wú)關(guān)性受到很多的限制。 因此, MS使用類(lèi)型庫(kù)來(lái)解決這個(gè)問(wèn)題. 類(lèi)型庫(kù)文件是一個(gè)二進(jìn)制文件, 后綴為.tlb.用MIDL工具編譯idl文件可以產(chǎn)生類(lèi)型庫(kù)文件,在實(shí)際的開(kāi)發(fā)過(guò)程中不一定要手工使用MIDL工具,IDE對(duì)其進(jìn)行了集成. 編譯完成以后,我們可以選擇把它隨組件庫(kù)一起分發(fā). 類(lèi)型庫(kù)以機(jī)器可讀的方式描述了組件與外界交互的必要信息. 如COM對(duì)象的CLSID, 它支持的接口的IID,接口的成員函數(shù)的簽名等
3、等. 本質(zhì)上它等價(jià)于描述接口的C/C+頭文件.,326,一個(gè)類(lèi)型庫(kù)可以包含多個(gè)COM對(duì)象,這些COM對(duì)象可以實(shí)現(xiàn)多個(gè)接口,而且一般而言實(shí)現(xiàn)了IDispatch接口(不是必須).為了標(biāo)識(shí)這些類(lèi)型庫(kù),也使用GUID來(lái)作為它的唯一標(biāo)識(shí)LIBID.并且也在注冊(cè)表中注冊(cè),注冊(cè)位置是HKEY-CLASSES_ROOTTypeLib,注冊(cè)內(nèi)容主要指明類(lèi)型庫(kù)所描述的對(duì)象的載體(dll文件等)的位置. VB, Java等語(yǔ)言的開(kāi)發(fā)者不需要直接面對(duì)類(lèi)型庫(kù). 相反,它是由編譯器環(huán)境(VB虛擬機(jī),Java虛擬機(jī))來(lái)解釋它. 這樣它使得開(kāi)發(fā)者在開(kāi)發(fā)期能夠?yàn)g覽接口的相關(guān)信息. (以VB為例,通過(guò)Reference添加對(duì)類(lèi)
4、型庫(kù)的引用后,使用Object Browser就可以查看COM接口了, 另一個(gè)工具OLE/COM Object Viewer使用更加方便). 而開(kāi)發(fā)人員只需要使用宿主語(yǔ)言簡(jiǎn)單的語(yǔ)法,非常方便地使用COM. (煩心事交給編譯器的開(kāi)發(fā)者去吧! 我們看到,如果不是使用COM,而是以一般的庫(kù)函數(shù)的形式,在VB這樣的高端應(yīng)用中使用起來(lái)就沒(méi)有這么簡(jiǎn)便(對(duì)最終開(kāi)發(fā)者而言). 每一樣復(fù)雜的技術(shù),在使用者的舒適的背后,是底層開(kāi)發(fā)者的艱辛) 當(dāng)然,如果愿意,C+編譯器也可以利用類(lèi)型庫(kù). Visual CIDE中的ClassWizard和CBuilderIDE,DElphi中的importType Library命
5、令都可以讀入組件的類(lèi)型庫(kù),并利用其中的信息產(chǎn)生C代碼??蛻?hù)程序利用這些代碼可以使用COM組件。,426,并不是只有IDE的開(kāi)發(fā)者才知道怎樣解析類(lèi)型庫(kù). 為了操作類(lèi)型庫(kù),Windows提供了一些API(LoadTypeLib 和LoadRegTypeLib等)和COM接口(ITypeLib和ITypeInfo等). LoadTypeLib可以根據(jù)指定的文件名裝載類(lèi)型庫(kù),并返回ITypeLib接口. 使用LoadRegTypeLib可以根據(jù)類(lèi)型庫(kù)的LIBID查找注冊(cè)表,找到類(lèi)型庫(kù)文件,返回ITypeLib接口. ITypeLib接口代表了類(lèi)型庫(kù)本身.使用其GetTypeInfoofGuid根據(jù)接口
6、的IID或者使用GetTypeInfo根據(jù)接口在類(lèi)型庫(kù)中的索引號(hào)可以返回ITypeInfo接口. ITypeInfo接口則代表了接口的全部信息.包括有哪些方法,方法的簽名等等. 如果接口是IDispatch接口,則還可以使用GetIDsofNames函數(shù)來(lái)根據(jù)方法的名字得到其分發(fā)ID,并使用Invoke函數(shù)通過(guò)方法的分發(fā)ID來(lái)執(zhí)行這個(gè)方法. 因此,為了在編譯時(shí)刻了解接口的信息, 客戶(hù)程序要么得到COM組件的IDL文件(使用頭類(lèi)型定義頭文件,在代碼中通知編譯器接口的類(lèi)型,如C+), 要么得到它的類(lèi)型庫(kù)文件(代碼中沒(méi)有準(zhǔn)確的信息,由IDE環(huán)境從類(lèi)型庫(kù)中讀取接口類(lèi)型信息,如VB), 才能順利地構(gòu)造客
7、戶(hù)應(yīng)用程序,從而使用COM對(duì)象.,526,無(wú)論是通過(guò)頭文件,還是通過(guò)類(lèi)型庫(kù),我們?cè)陂_(kāi)發(fā)客戶(hù)程序時(shí)都有關(guān)于接口的先驗(yàn)知識(shí).這些先驗(yàn)信息幫助我們順利地編譯客戶(hù)程序.這種方式我們有時(shí)稱(chēng)為靜態(tài)調(diào)用,或者早綁定(early binding). 但是,還存在這樣的情況,有的語(yǔ)言在開(kāi)發(fā)過(guò)程中并沒(méi)有經(jīng)過(guò)編譯階段,而是直接以源代碼的形式被配置發(fā)布. 在運(yùn)行時(shí)才被解釋運(yùn)行.比如以HTML為基礎(chǔ)的腳本語(yǔ)言.(VBScript,JavaScript等).它們?cè)跒g覽器或Web服務(wù)器的環(huán)境中執(zhí)行. 腳本代碼以純文本的形式嵌入在HTML文件中. 為了豐富腳本的功能,它們也可以創(chuàng)建COM對(duì)象,執(zhí)行特殊的功能,比如訪問(wèn)數(shù)據(jù)庫(kù)等
8、等. 比如: var obj = new ActiveXObject(“LuBenjie.AutoObj); alert(obj.Hello(); 在腳本引擎中,目前還不能使用類(lèi)型庫(kù)或其他的先驗(yàn)知識(shí)來(lái)描述接口的信息.這意味著對(duì)象自身要幫助腳本解釋器,將文本形式的腳本代碼翻譯為有意義的方法調(diào)用. 這種方式我們稱(chēng)為動(dòng)態(tài)調(diào)用,或者晚綁定(late binding). 為了支持晚綁定,COM定義了一個(gè)接口,用來(lái)表達(dá)這種翻譯機(jī)制,這個(gè)接口就是IDispatch.分發(fā)接口有時(shí)稱(chēng)為自動(dòng)化接口,實(shí)現(xiàn)了此接口的對(duì)象稱(chēng)為自動(dòng)化對(duì)象. 自動(dòng)化接口的定義如下:,2 IDispatch接口,626,class IDis
9、patch:public IUnknown public: HRESULT GetTypeInfoCount( unsigned int FAR* pctinfo ); /如果對(duì)象提供類(lèi)型支持,則返回1,否則0. 客戶(hù)在獲取類(lèi)型信息之前先使用此函數(shù)進(jìn)行判斷. HRESULT GetTypeInfo( unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo ); / 一般給iTInfo賦值0, 返回指向?qū)ο箢?lèi)型信息的ITypeInfo接口指針, 通過(guò)ITypeInfo接口可以訪問(wèn)該自動(dòng)化接口的所有類(lèi)型信息. HRESULT GetI
10、DsOfNames( REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId ); / 返回指定名字的方法或?qū)傩缘姆职l(fā)ID. IDispatch使用分發(fā)ID管理接口的屬性和方法. rgszNames 指定屬性或方法的名字, rgDispId返回其分發(fā)ID HRESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VA
11、RIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr ); ; /是命令的翻譯器??蛻?hù)程序通過(guò)invoke函數(shù)訪問(wèn)方法或?qū)傩???蛻?hù)給定分發(fā)ID dispIdMember 、輸入?yún)?shù)pDispParams 。invoke返回輸出參數(shù)pDispParams .自動(dòng)化對(duì)象所有的方法和屬性的調(diào)用都通過(guò)invoke函數(shù)來(lái) 實(shí)現(xiàn)。使得運(yùn)行時(shí)刻動(dòng)態(tài)綁定屬性和方法并進(jìn)行參數(shù)類(lèi)型檢查成為可能.,726,當(dāng)一個(gè)腳本引擎首次嘗試訪問(wèn)一個(gè)對(duì)象時(shí),它使用QueryInterface向?qū)ο笳?qǐng)求IDispatch接口.如果請(qǐng)
12、求失敗,則不能使用此對(duì)象.如果成功,則繼續(xù)調(diào)用GetIDsofName方法,得到方法或?qū)傩缘姆职l(fā)ID號(hào).通過(guò)此ID號(hào),調(diào)用Invoke方法,就可以調(diào)用想要調(diào)用的方法. 分發(fā)接口與普通接口的區(qū)別在于,接口的邏輯功能是如何被調(diào)用的.普通的COM接口是以該方法的靜態(tài)的先驗(yàn)知識(shí)為基礎(chǔ).而分發(fā)接口是以該方法的預(yù)期的文字表示為基礎(chǔ).如果調(diào)用者正確地猜測(cè)出方法的原型,那么此調(diào)用可以被順利地分發(fā),否則不能. 假設(shè)有一個(gè)自動(dòng)化對(duì)象CMath,它只實(shí)現(xiàn)了分發(fā)接口,進(jìn)行加減乘除的工作.這些具體的工作由內(nèi)部函數(shù)來(lái)完成.并沒(méi)有向外界提供接口.這些計(jì)算功能由Invoke函數(shù)根據(jù)分發(fā)ID來(lái)調(diào)用特定的函數(shù). uuid(C28
13、95C1F-020E-4C1F-8A65-F59094DFBD97) dispinterface DMath /dispinterface 關(guān)鍵字說(shuō)明這是一個(gè)分發(fā)接口. properties: methods: id(0) long Add(long Op1,long Op2); /0,1,2,3分別是分發(fā)ID id(1) long Substract(long Op1,long Op2); id(2) long Multiply(long Op1,long Op2); id(3) long Divide(long Op1,long Op2); 此對(duì)象的虛表及其分發(fā)表示意圖如下:,826,自動(dòng)
14、化對(duì)象的虛表和分發(fā)表.,926,自動(dòng)化對(duì)象可以只實(shí)現(xiàn)分發(fā)接口: class CMath:public IDispatch public: /來(lái)自IUnknown的三個(gè)函數(shù) virtual HRESULT _stdcall QueryInterface() ; virtual ULONG_stdcall AddRef() ; virtual ULONG_stdcall Release() ; / 來(lái)自IDispatch的四個(gè)函數(shù) HRESULT GetTypeInfoCount( ); HRESULT GetTypeInfo( ); HRESULT GetIDsOfNames(); HRESUL
15、T Invoke( ); ;/此COM對(duì)象只能通過(guò)分發(fā)接口給外界提供服務(wù).雖然這樣做顯得別扭,有舍近求遠(yuǎn)之嫌, 但是,原理上是可行的.,1026,更常用地,我們把具體的計(jì)算功能也作為接口直接暴露出去,我們從IDispatch派生一個(gè)接口IMath. object, uuid(2756E11C-A606-482F-969C-14153E1D1609), dual/說(shuō)明是一個(gè)雙接口 interface IMath: IDispatch properties: methods: id(0) HRESULT Add /0,1,2,3分別是分發(fā)ID (in long Op1,in long Op2,ou
16、t,retval long* pResult); id(1) HRESULT Substract (in long Op1,in long Op2,out,retval long* pResult); id(2) HRESULT Multiply (in long Op1,in long Op2,out,retval long* pResult); id(3) HRESULT Divide (in long Op1,in long Op2,out,retval long* pResult); 自動(dòng)化對(duì)象實(shí)現(xiàn)雙接口:,1126,class CMath:public IMath public: /
17、來(lái)自IUnknown的三個(gè)函數(shù) virtual HRESULT _stdcall QueryInterface() ; virtual ULONG_stdcall AddRef() ; virtual ULONG_stdcall Release() ; / 來(lái)自IDispatch的四個(gè)函數(shù) HRESULT GetTypeInfoCount( ); HRESULT GetTypeInfo( ); HRESULT GetIDsOfNames(); HRESULT Invoke( ); / 來(lái)自IMath的三個(gè)函數(shù) HRESULT Add(long Op1, long Op2, long* pRes
18、ult); HRESULT Substract(long Op1, long Op2, long* pResult); HRESULT Multiply(long Op1, long Op2, long* pResult); HRESULT Divide(long Op1, long Op2, long* pResult); ;/此COM對(duì)象同時(shí)通過(guò)分發(fā)接口給外界提供分發(fā)調(diào)用服務(wù);通過(guò)IMath接口直接通過(guò)虛表來(lái)提供普通的服務(wù). 實(shí)現(xiàn)雙接口的自動(dòng)化對(duì)象的虛表和分發(fā)表:,1226,實(shí)現(xiàn)雙接口的自動(dòng)化對(duì)象的虛表和分發(fā)表,1326,3 自動(dòng)化接口的實(shí)現(xiàn),分發(fā)接口的四個(gè)函數(shù)從功能上來(lái)說(shuō)分為兩組: Ge
19、tTypeInfoCount與GetTypeInfo函數(shù)表示對(duì)類(lèi)型庫(kù)的支持. 通??蛻?hù)并不需要從分發(fā)接口的這兩個(gè)函數(shù)中來(lái)訪問(wèn)類(lèi)型庫(kù).如果愿意,客戶(hù)可以借助IDE生成封裝類(lèi),或者直接使用操作類(lèi)型庫(kù)也可以. 但如果真要實(shí)現(xiàn)它,那么: 提供類(lèi)型庫(kù)文件 (MIDL編譯器對(duì)IDL編譯的結(jié)果) GetTypeInfoCount返回1, 否則返回0; GetTypeInfo 使用LoadTypeLib得到ITypeLib接口.然后得到 ITypeInfo接口.一旦客戶(hù)得到ITypeInfo接口指針就可以完全地了解接口的類(lèi)型及其所支持的屬性和方法。 GetIDsOfNames和Invoke完成函數(shù)的分發(fā)調(diào)用.
20、 GetIDsOfNames有兩種實(shí)現(xiàn)方法: 1.由自動(dòng)化對(duì)象自己實(shí)現(xiàn)。它當(dāng)然知道自己所有的方法和屬性的分發(fā)ID。使用switch case或者如果數(shù)目太多的話(huà),使用表格進(jìn)行查表.,1426,HRESULT GetIDsOfNames( REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId ) / 假設(shè)cNames=1,即一回只查一個(gè)名字. char * str=OLE2T(rgszzNames0); if (strcmp(“Add”,str,3)=0) rg
21、DispId0=0; /加法返回0 else if (strcmp(“Substract”,str,8)=0) rgDispId0=1; /減法返回1 else if 2.如果實(shí)現(xiàn)了GetTypeInfo,那么直接從其中得到ITypeInfo指針,然后使用這個(gè)指針的GetIDsOfNames方法即可.(繞了一大圈,但是也可行). HRESULT GetIDsOfNames() ITypeInfo * pITI; GetTypeInfo( ,1526,Invoke函數(shù)的實(shí)現(xiàn)。 1??梢愿鶕?jù)分發(fā)ID,逐個(gè)分支處理,可以使用內(nèi)部函數(shù),或者,如果是雙接口,分支內(nèi)部直接使用IMath接口的功能函數(shù). H
22、RESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr ); switch (dispIdMember) case 0: /作加法, 直接實(shí)現(xiàn),或者調(diào)用內(nèi)部函數(shù). case1: /減法 2。使用類(lèi)型信息指針。 如果實(shí)現(xiàn)了GetTypeInfo,那么直接從其中得到ITypeInfo指針,然后使用
23、這個(gè)指針的Invoke方法即可.(也繞了一大圈,但是也可行). HRESULT Invoke() ITypeInfo * pITI; GetTypeInfo( ,1626,4.使用自動(dòng)化對(duì)象.,對(duì)于自動(dòng)化對(duì)象的使用,根據(jù)其實(shí)現(xiàn)接口和對(duì)類(lèi)型庫(kù)的支持程度不同, 有不同的使用方法: 只實(shí)現(xiàn)了分發(fā)接口,沒(méi)有提供類(lèi)型庫(kù).只能使用晚綁定. 實(shí)現(xiàn)了分發(fā)接口,提供了類(lèi)型庫(kù),當(dāng)然可以使用晚綁定,也可以使用DISPID綁定(早綁定的一種,為了區(qū)分起見(jiàn)就命名為DISPID綁定). 實(shí)現(xiàn)了雙接口,提供了類(lèi)型庫(kù), 那么可以使用晚綁定,DISPID綁定和早綁定. 晚綁定-DISPID綁定-早綁定 性能越來(lái)越高. 靈活性越
24、來(lái)越低.,1726,4.1 晚綁定,晚綁定. 一般的COM對(duì)象都只能使用早綁定.但是自動(dòng)化對(duì)象可以使用晚綁定.是重要特色之一.開(kāi)發(fā)階段不進(jìn)行類(lèi)型檢查,運(yùn)行時(shí)決定組件的功能. 代價(jià)昂貴,速度最慢. 靈活性最高. 服務(wù)器接口發(fā)生變化(比如說(shuō)分發(fā)ID變了) ,客戶(hù)程序不用重現(xiàn)編譯. 1.使用VB Dim obj as Object Set obj=CreateObject(“MathLib.Math”) /動(dòng)態(tài)創(chuàng)建. obj.Add(10,20) /結(jié)果為30 Set obj=Nothing /釋放對(duì)象 注意,在編譯時(shí)刻并沒(méi)有進(jìn)行類(lèi)型檢查, obj.Add(10,20) 純屬猜測(cè)! 如果方法的名字不
25、符合或者參數(shù)不符合,都將引起運(yùn)行時(shí)錯(cuò)誤. 2.使用C+. 使用C+ 我們能更清楚地看到分發(fā)調(diào)用的過(guò)程.(雖然晚綁定一般是針對(duì)VB這樣的語(yǔ)言的),1826,首先看函數(shù)調(diào)用調(diào)用的參數(shù)類(lèi)型 typedef struct tagDISPPARAMS VARIANTARG *rgvarg; /參數(shù)數(shù)組,類(lèi)型為VARIANT,大小為cArgs DISPID *rgdispidNamedArgs;/命名參數(shù)的ID數(shù)組. UINT cArgs; /參數(shù)的個(gè)數(shù) UINT cNamedArgs; /命名參數(shù)的個(gè)數(shù) 見(jiàn)MSDN文檔 DISPPARAMS; 其中VARIANT是一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體中包含巨大的Union
26、和一個(gè)指示實(shí)際類(lèi)型的域vt.見(jiàn)MSDN文檔. 在使用晚綁定時(shí),只能使用VARIANT所支持的數(shù)據(jù)類(lèi)型. 客戶(hù)的調(diào)用代碼: IDispatch *pD; HRESULT hr=CoCreateInstance(CLSID_Math, NULL, CLSCTX_SERVER, IID_IDispatch, /加法字符串對(duì)應(yīng)的分發(fā)ID存在此, 下面先找到它,1926,pD-GetIDsofNames(IID_NULL, lpOleStr, 1,LOCAL_SYSTEM_DEFAULT, /釋放接口,2026,注意以上計(jì)算過(guò)程,我們只是使用了分發(fā)接口,我們猜測(cè)了加法的名字和參數(shù).我們事先沒(méi)有使用到自動(dòng)
27、化對(duì)象的任何信息.不需要包含接口聲明的頭文件. 編譯時(shí)刻沒(méi)有進(jìn)行任何類(lèi)型檢查. 如果猜測(cè)失誤將引起運(yùn)行時(shí)錯(cuò)誤.,2126,4.2 DISPID綁定,如果提供類(lèi)型庫(kù),那么就可以在編譯時(shí)進(jìn)行類(lèi)型檢查. VB中使用Reference導(dǎo)入類(lèi)型庫(kù).我們就可以象VB中固有的數(shù)據(jù)類(lèi)型一樣使用COM對(duì)象.編譯器將根據(jù)組件中的類(lèi)型信息檢查代碼中的語(yǔ)法和參數(shù)類(lèi)型. VB為方法和屬性緩存一個(gè)DISPID. 避免在運(yùn)行時(shí)刻去查詢(xún)方法或?qū)傩缘姆职l(fā)ID. 以上措施,可以避免出錯(cuò),提高性能. 組件的接口改變時(shí),要重新編譯客戶(hù)程序. Dim obj as New MathLib.Math obj.Add(10,20) /返回
28、30 不是猜測(cè)的! 如果不符合,則編譯會(huì)出錯(cuò)! 這是類(lèi)型庫(kù)起的作用. 下面看C+中如何使用DISPID綁定 MFC提供了COleDispatchDriver類(lèi),可以用來(lái)使用DISPID綁定來(lái)訪問(wèn)自動(dòng)化對(duì)象:,2226,COleDispatchDriver類(lèi)是MFC提供的封裝類(lèi),它通過(guò)自動(dòng)化對(duì)象的類(lèi)型庫(kù)把原自動(dòng)化對(duì)象的方法和屬性的分發(fā)ID硬性地記錄下來(lái), 把原來(lái)的方法和屬性在封裝類(lèi)中進(jìn)行封裝. 使得用戶(hù)避免復(fù)雜的invoke參數(shù)序列, COleDispatchDriver 有一個(gè)數(shù)據(jù)成員m_lpDispatch,它包含了對(duì)應(yīng)組件的IDispatch接口指針。COleDispatchDriver提
29、供了幾個(gè)成員函數(shù)包括InvokeHelper GetProperty SetProperty,這三個(gè)函數(shù)通過(guò)m_lpDispatch調(diào)用invoke函數(shù)。 COleDispatchDriver的其他成員管理IDispatch接口指針,CreateDispatch根據(jù)CLSID創(chuàng)建自動(dòng)化對(duì)象,并把IDispatch接口指針賦給m_lpDispatch成員。AttachDispatch使得當(dāng)前的COleDispatchDriver與某個(gè)自動(dòng)化對(duì)象聯(lián)系起來(lái)。DetachDispatch則取消這種聯(lián)系。,2326,兩種使用方式: 根據(jù)組件的類(lèi)型庫(kù)生成COleDispatchDriver的派生類(lèi)。從Class
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 甘肅靖遠(yuǎn)縣高三數(shù)學(xué)試卷
- 高校聯(lián)盟數(shù)學(xué)試卷
- 方城縣中學(xué)二模數(shù)學(xué)試卷
- 關(guān)于千克方面的數(shù)學(xué)試卷
- 2025年甘肅中醫(yī)藥大學(xué)招聘41人筆試歷年專(zhuān)業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025至2030船體清潔機(jī)器人行業(yè)市場(chǎng)深度調(diào)研及前景趨勢(shì)與投資報(bào)告
- 贛州高考二模數(shù)學(xué)試卷
- 二年級(jí)畢業(yè)題數(shù)學(xué)試卷
- 高一集合數(shù)學(xué)試卷
- 體育賽事官方藝術(shù)家合作項(xiàng)目的社區(qū)參與度分析考核試卷
- 2022下半年四川公務(wù)員考試申論試題(行政執(zhí)法卷)
- 《金屬與石材幕墻工程技術(shù)規(guī)范》jgj1332001-2021112401384
- 海南省海口市(2024年-2025年小學(xué)四年級(jí)語(yǔ)文)人教版期末考試((上下)學(xué)期)試卷及答案
- 護(hù)理質(zhì)量控制中心經(jīng)費(fèi)管理辦法
- MFP無(wú)機(jī)硅聲能凝膠施工方案
- GB/T 150.1-2024壓力容器第1部分:通用要求
- 籃球課程思政課程設(shè)計(jì)
- 2024年質(zhì)量知識(shí)競(jìng)賽考試題庫(kù)500題(含答案)
- 風(fēng)電預(yù)收購(gòu)協(xié)議書(shū)范本
- 2024年北京市中考數(shù)學(xué)真題試卷及答案
- TD/T 1056-2019 縣級(jí)國(guó)土資源調(diào)查生產(chǎn)成本定額(正式版)
評(píng)論
0/150
提交評(píng)論