www.tjgcgs88.cn-狠狠久久亚洲欧美专区不卡,久久精品国产99久久无毒不卡,噼里啪啦国语版在线观看,zσzσzσ女人极品另类

  • <strike id="qgi8o"><td id="qgi8o"></td></strike>
  • <ul id="qgi8o"><acronym id="qgi8o"></acronym></ul>
  • <li id="qgi8o"></li>
    <ul id="qgi8o"></ul>
    <strike id="qgi8o"><rt id="qgi8o"></rt></strike>
    <ul id="qgi8o"><center id="qgi8o"></center></ul>
  • <kbd id="qgi8o"></kbd>

    高分(200分)! VC++ COM 組件 200分高手,C++,COM容器,組件

    在COM標(biāo)準(zhǔn)中,一個(gè)組件程序也被稱(chēng)為一個(gè)模塊,它可以是一個(gè)動(dòng)態(tài)連接庫(kù)(DLL), 被稱(chēng)為進(jìn)程內(nèi)組件(in-of-process component)也可以是一個(gè)可執(zhí)行程序(EXE),被稱(chēng)為進(jìn)程外組件(out-of-process component).

    COM對(duì)象是建立在二進(jìn)制可執(zhí)行代碼級(jí)的基礎(chǔ)上,而C++等語(yǔ)言中的對(duì)象是建立在源代碼級(jí)基礎(chǔ)上的,因此COM對(duì)象是語(yǔ)言無(wú)關(guān)的。這一特性使用不同編程語(yǔ)言開(kāi)發(fā)的組件對(duì)象進(jìn)行交互成為可能。

    在Microsoft Windows系統(tǒng)平臺(tái)上,COM技術(shù)被應(yīng)用于系統(tǒng)的各個(gè)層次,從底層的COM對(duì)象管理到上層的應(yīng)用程序交互都用到了COM標(biāo)準(zhǔn)。

    概述

    COM既提出了組件之間進(jìn)行交互的規(guī)范,也提供了實(shí)現(xiàn)交互的環(huán)境, 因?yàn)榻M件對(duì)象之間交互的規(guī)范不依賴(lài)于任何特定的語(yǔ)言,所以COM也可以是不同語(yǔ)言協(xié)作開(kāi)發(fā)的一種標(biāo)準(zhǔn)。

    OLE技術(shù)以COM規(guī)范為基礎(chǔ),OLE充分發(fā)揮了COM標(biāo)準(zhǔn)的優(yōu)勢(shì),使Windows操作系統(tǒng)上的應(yīng)用程序具有極強(qiáng)的可交互性。如果沒(méi)有OLE的支持,Windows操作系統(tǒng)則會(huì)遜色很多。

    但是,COM規(guī)范并不局限于OLE技術(shù),實(shí)際上,OLE技術(shù)只是COM的一個(gè)應(yīng)用而已,這幾年,OLE技術(shù)在進(jìn)行網(wǎng)絡(luò)互連是顯示出了很大的局限性,而COM則表現(xiàn)出了極強(qiáng)的適應(yīng)能力。

    COM標(biāo)準(zhǔn)包括規(guī)范和實(shí)現(xiàn)兩大部分,規(guī)范部分定義了組件和組件之間通信的機(jī)制,這些規(guī)范不依賴(lài)于任何特定的語(yǔ)言和操作系統(tǒng),只要按照該規(guī)范,任何語(yǔ)言都可以使用; COM標(biāo)準(zhǔn)的實(shí)現(xiàn)部分是COM庫(kù),COM庫(kù)為COM規(guī)范的具體實(shí)現(xiàn)提供了一些核心服務(wù)。

    COM是面對(duì)對(duì)象的軟件模型,因而對(duì)象是他的基本要素之一。類(lèi)似于C++中對(duì)象的概念,對(duì)象是某個(gè)類(lèi)(class)的一個(gè)實(shí)例;而類(lèi)則是一組相關(guān)的數(shù)據(jù)和功能組和在一起的一個(gè)定義。使用對(duì)象的應(yīng)用(或另一個(gè)對(duì)象)成為客戶,有時(shí)也成為對(duì)象的用戶。

    接口是一組邏輯上相關(guān)的函數(shù)集合,其函數(shù)也被稱(chēng)為接口成員函數(shù)。對(duì)象通過(guò)接口成員函數(shù)為客戶提供各種形式的服務(wù)。

    在COM模型中,對(duì)象本身對(duì)于客戶來(lái)說(shuō)是不可見(jiàn)的,客戶請(qǐng)求服務(wù)時(shí),只能通過(guò)接口進(jìn)行。每一個(gè)接口都由一個(gè)128位的全局唯一標(biāo)識(shí)符(GUID,Globally Unique Identifier)來(lái)標(biāo)識(shí)。客戶通過(guò)GUID獲得接口的指針,在通過(guò)接口指針,客戶就可以調(diào)用其相應(yīng)的成員函數(shù)。

    一般來(lái)說(shuō),接口是不變的,只要客戶期望的接口在組建對(duì)象中還存在,它就可以繼續(xù)使用該接口所提供的服務(wù)。對(duì)象可以支持多個(gè)接口,因此對(duì)組件對(duì)象的升級(jí)可通過(guò)增加接口的辦法實(shí)現(xiàn),這樣得到的新接口可以不影響老接口的使用。

    客戶如何來(lái)標(biāo)識(shí)COM對(duì)象呢?與接口類(lèi)似,每個(gè)對(duì)象也用一個(gè)128位GUID來(lái)標(biāo)識(shí),稱(chēng)為CLSID(class identifier,類(lèi)標(biāo)識(shí)符或類(lèi)ID),用CLSID標(biāo)識(shí)對(duì)象可以保證(概率意義上)在全球范圍內(nèi)的唯一性。

    只要系統(tǒng)中含有這類(lèi)COM對(duì)象的信息,并包括COM對(duì)象所在的模塊文件(DLL或EXE文件)以及COM對(duì)象在代碼中的入口點(diǎn),客戶程序就可以由此CLSID來(lái)創(chuàng)建COM對(duì)象。

    那么客戶怎么使用COM對(duì)象所提供的服務(wù)呢?客戶獲得的又是什么呢?

    實(shí)際上,客戶成功創(chuàng)建對(duì)象后,它得到的是一個(gè)指向?qū)ο竽硞€(gè)接口的指針,因?yàn)镃OM對(duì)象至少實(shí)現(xiàn)一個(gè)接口,所以客戶就可以調(diào)用該接口提供的所有服務(wù)。

    但是COM對(duì)象可以有自己的狀態(tài),正是這種狀態(tài)才使客戶感覺(jué)到COM對(duì)象的存在。如果客戶同時(shí)擁有兩個(gè)相同CLSID的對(duì)象,則兩個(gè)對(duì)象可以有不同的狀態(tài),客戶完全不必關(guān)心COM對(duì)象是怎么實(shí)現(xiàn)的,以及兩個(gè)對(duì)象的狀態(tài)數(shù)據(jù)之間有什么關(guān)系(數(shù)組或者鏈表)。當(dāng)然,COM對(duì)象也可以是無(wú)狀態(tài)的,這種COM對(duì)象以提供功能服務(wù)為主,可以用來(lái)代替?zhèn)鹘y(tǒng)的API函數(shù)接口,使得應(yīng)用程序編程接口更為有序,組織層次性更強(qiáng)。

    COM本身除了規(guī)范之外,也有實(shí)現(xiàn)的部分,其中包括一些核心的系統(tǒng)級(jí)代碼,也正是這部分核心代碼,才使得對(duì)象和客戶之間可通過(guò)接口在二進(jìn)制代碼級(jí)進(jìn)行交互 。

    在Microsoft Windows操作系統(tǒng)環(huán)境下,這些庫(kù)以.dll文件的形勢(shì)存在,其中包括以下內(nèi)容:

    (1) 提供了少量的API函數(shù)實(shí)現(xiàn)客戶和服務(wù)端COM應(yīng)用的創(chuàng)建過(guò)程。在客戶端,主要是一些創(chuàng)建函數(shù);而在服務(wù)器端,提供一些對(duì)象的訪問(wèn)支持。

    (2) COM通過(guò)注冊(cè)表查找本地服務(wù)器即EXE程序,以及程序名與CLSID的轉(zhuǎn)換等。

    (3) 提供了一些標(biāo)準(zhǔn)的內(nèi)存控制方法,使應(yīng)用控制進(jìn)程中內(nèi)存的分配。

    COM庫(kù)一般不在應(yīng)用程序?qū)訉?shí)現(xiàn),而在操作系統(tǒng)層次上實(shí)現(xiàn),因此一個(gè)操作系統(tǒng)只有一個(gè)COM庫(kù)實(shí)現(xiàn)。而且COM庫(kù)的實(shí)現(xiàn)必須依賴(lài)于具體的系統(tǒng)平臺(tái),尤其是系統(tǒng)底層的一些標(biāo)準(zhǔn)。

    COM庫(kù)可以保證所有的組件按照統(tǒng)一的方式進(jìn)行交互操作,而且它使我們?cè)诰帉?xiě)COM應(yīng)用時(shí),可以不用編寫(xiě)為進(jìn)行COM通信而必需的大量基礎(chǔ)代碼,而是直接利用COM庫(kù)提供的API進(jìn)行編程,從而大大加快了開(kāi)發(fā)的速度。例如,現(xiàn)在COM庫(kù)的版本都支持遠(yuǎn)程組件即分布式COM,我們不用編寫(xiě)任何網(wǎng)絡(luò)或者RPC(remote procedure call)的代碼,就可以實(shí)現(xiàn)在網(wǎng)絡(luò)上進(jìn)行程序之間的通信。

    如果我們用面向?qū)ο笳Z(yǔ)言來(lái)實(shí)現(xiàn)COM對(duì)象,則很自然可以用類(lèi)類(lèi)定義對(duì)象。在C語(yǔ)言中,對(duì)象的概念可能變成一個(gè)邏輯概念,如果兩個(gè)對(duì)象同時(shí)存在,則在接口實(shí)現(xiàn)中必須明確知道所進(jìn)行的操作是針對(duì)哪個(gè)對(duì)象的,這個(gè)過(guò)程可由COM接口的定義保證。

    COM規(guī)范使用GUID來(lái)標(biāo)識(shí)COM對(duì)象的思想源于OSF(Open Software Foundation)采用的UUID(Universallz Unique Identifier), UUID被定義為DCE(Distributed Computing Environment)的一部分,主要用于表識(shí)RPC通信的雙方。

    除了封裝性和重用性,C++對(duì)象還有一個(gè)重要特性是多態(tài)性。正是C++對(duì)象的多態(tài)性,才體現(xiàn)了C++語(yǔ)言用類(lèi)描述事物的高度抽象的特征;COM對(duì)象也 具有多態(tài)性,但這種多態(tài)性需要通過(guò)COM對(duì)象所具有的接口才能體現(xiàn)出來(lái),就像C++對(duì)象的多態(tài)性需要通過(guò)其(virtual)函數(shù)才能體現(xiàn)一樣。

    從API到COM接口

    假如我們要實(shí)現(xiàn)一個(gè)字處理應(yīng)用系統(tǒng),它需要一個(gè)查字典的功能,按照組件化程序設(shè)計(jì)的方法,自然應(yīng)該把查字典的功能放到一個(gè)組件(.dll)程序中實(shí)現(xiàn)。如果以后字典程序的查找算法或者字典庫(kù)改變了,只要應(yīng)用程序和組件之間的接口不變,則新的組件程序仍然可以被應(yīng)用系統(tǒng)使用。這就是采用組件程序帶來(lái)的靈活性。

    為了把應(yīng)用系統(tǒng)和組件程序連接起來(lái),又能使它們協(xié)同工作,最簡(jiǎn)單的做法就是先定義一組查字典的函數(shù),而且這組函數(shù)盡可能一般化,不要加入特定的與字典庫(kù)相關(guān)的知識(shí)。

    函數(shù)
    功能說(shuō)明

    Initialize
    初始化

    LoadLibrary
    裝入字典庫(kù)

    InsertWord
    插入一個(gè)單詞

    DeleteWord
    刪除一個(gè)單詞

    LookupWord
    查找單詞

    RestoreLibrary
    把內(nèi)存中的字典庫(kù)存入指定的文件中

    FreeLibrary
    釋放字典庫(kù)

    平面型的API接口層可以很好地把兩個(gè)程序連接起來(lái),但存在以下一些問(wèn)題:

    (1) 當(dāng)API函數(shù)非常多時(shí),使用會(huì)非常不方便,需要對(duì)函數(shù)進(jìn)行組織。

    (2) API函數(shù)需要標(biāo)準(zhǔn)化,按照統(tǒng)一的調(diào)用方式進(jìn)行處理,以適應(yīng)不同的語(yǔ)言編程實(shí)現(xiàn)。參數(shù)的傳遞順序,參數(shù)類(lèi)型,寒暑返回處理都需要標(biāo)準(zhǔn)化。

    COM定義了一套完整的接口規(guī)范,不僅可以彌補(bǔ)以上API作為組件借口的不足,還充分發(fā)揮了組件對(duì)象的優(yōu)勢(shì),并實(shí)現(xiàn)了組件對(duì)象的多態(tài)性。

    接口定義和標(biāo)識(shí)
    從技術(shù)上講,接口是包含了一組函數(shù)的數(shù)據(jù)結(jié)構(gòu),通過(guò)這組數(shù)據(jù)結(jié)構(gòu),客戶代碼可以調(diào)用組件對(duì)象的功能。接口定義了一組成員函數(shù),這組成員函數(shù)是組件對(duì)象暴露出來(lái)的所有信息,客戶程序利用這些函數(shù)或的組件對(duì)象的服務(wù)。

    客戶程序用一個(gè)指向接口數(shù)據(jù)機(jī)構(gòu)的指針來(lái)調(diào)用接口成員函數(shù)。接口指針實(shí)際上又指向另一個(gè)指針,這第二個(gè)指針指向一組函數(shù),稱(chēng)為接口函數(shù)表(虛函數(shù)表),接口函數(shù)表中每一項(xiàng)為4個(gè)字節(jié)長(zhǎng)的函數(shù)指針,每個(gè)函數(shù)指針與對(duì)象的具體實(shí)現(xiàn)連接起來(lái)。通過(guò)這種方式,客戶只要獲得了接口指針,就可以調(diào)用到對(duì)象的實(shí)際功能。

    對(duì)于一個(gè)接口來(lái)說(shuō),他的虛函數(shù)表vtable是確定的,因此接口的成員函數(shù)個(gè)數(shù)是不變的,而且成員函數(shù)的先后順序也是不變的;對(duì)于每個(gè)成員函數(shù)來(lái)說(shuō),其參數(shù)和返回值也是確定的。

    在一個(gè)接口的定義中,所有這些信息都必須在二進(jìn)制一級(jí)確定,不管什么語(yǔ)言,只要能支持這樣的內(nèi)存結(jié)構(gòu)描述,也就是能夠支持“structure“或“record“類(lèi)型,并且這種類(lèi)型能夠包含雙重的指向函數(shù)指針表的成員,則它就可以支持接口的描述,從而可以用于編寫(xiě)COM組件或者使用COM組件。

    接口描述語(yǔ)言IDL

    COM規(guī)范在采用OSF的DCE規(guī)范描述遠(yuǎn)程調(diào)用接口IDL的基礎(chǔ)上,進(jìn)行擴(kuò)展形成了COM接口的描述語(yǔ)言。

    COM規(guī)范使用的IDL接口描述語(yǔ)言不僅可用于定義COM接口,同時(shí)還定義了一些常用的數(shù)據(jù)類(lèi)型,也可以描述自定義的數(shù)據(jù)結(jié)構(gòu),對(duì)于接口成員函數(shù),我們可以指定每個(gè)參數(shù)的類(lèi)型,輸入輸出特性,甚至支持可變長(zhǎng)度的數(shù)組的描述。IDL支持指針類(lèi)型,與C/C++很類(lèi)似。

    Microsoft Visual C++提供了MIDL工具,可以把IDL接口描述文件編譯成C/C++兼容的接口描述頭文件(.h)。

    IUnknown的定義(IDL):

    interface IUnknown
    {

    HRESULT QueryInterface([in] REFIID iid, [out] void **ppv);
    ULONG AddRef(void);
    ULONG Release(void);
    }

    IUnknown的定義(C++):

    class IUnknown
    {

    Public:
    virtual HRESULT _stdcall QueryInterface([in] REFIID iid, [out] void **ppv)=0;
    virtual ULONG _stdcall AddRef(void)=0;
    virtual ULONG _stdcall Release(void)=0;
    }

    進(jìn)程內(nèi)組件

    因?yàn)檫M(jìn)程內(nèi)組件和客戶程序運(yùn)行在同一個(gè)進(jìn)程地址空間中,所以一旦客戶程序與組件程序建立起通信關(guān)系之后,客戶程序得到的接口指針指向組件程序中接口的vtable,這個(gè)vtable包含了所有成員函數(shù)地址,客戶代碼可以直接調(diào)用這些成員函數(shù),所以其效率非常高。

    因?yàn)镈LL程序是在運(yùn)行時(shí)刻被客戶裝入到內(nèi)存中的,所以DLL模塊本身也是獨(dú)立的,它并不依賴(lài)于客戶程序。

    在C++語(yǔ)言中,為了使編制的DLL程序更為通用,一般指定DLL的引出函數(shù)使用_stdcall調(diào)用習(xí)慣,如果使用了_cdecl調(diào)用習(xí)慣,則有些編程語(yǔ)言環(huán)境就不能使用這些DLL程序。C++編譯器為DLL程序的每個(gè)引出函數(shù)生成了一個(gè)修飾名,這些修飾名對(duì)于不同的編譯器并不兼容,因此,從通用性角度出發(fā),我們?cè)诿總€(gè)函數(shù)定義前加上extern ?C“ 說(shuō)明符。在Visual C++ 開(kāi)發(fā)環(huán)境中,下面的說(shuō)明語(yǔ)句可以很好的說(shuō)明一個(gè)引出函數(shù):

    extern ? C“ int _stdcall MyFunction(int n);

    為了編制DLL程序,我們可以按照這樣的步驟:

    (1) 創(chuàng)建一個(gè)DLL工程

    (2) 對(duì)每個(gè)引出函數(shù),使用extern ? C“說(shuō)明符,以及_stdcall修飾符,如上面對(duì)MyFunction函數(shù)的說(shuō)明。

    (3) 按照傳統(tǒng)的編程方法,我們還應(yīng)該編寫(xiě)一個(gè)DEF文件,用來(lái)描述DLL程序的模塊信息。在Win32平臺(tái)上,我們可以不使用DEF文件,而是直接在函數(shù)說(shuō)明時(shí)使用_declspec(dllexport)說(shuō)明符,例如:

    extern ? C“_declspec(dllexport) int _stdcall MyFunction(int n);

    按照這樣的方法建立起來(lái)的DLL模塊可以被其他程序調(diào)用,因?yàn)镃++連接器會(huì)把所有引出函數(shù)的信息連接到最終的目標(biāo)代碼中。

    從客戶程序一方來(lái)看,有三個(gè)系統(tǒng)函數(shù)可用于操作DLL程序,LoadLibrary, GetProcAddress, 和FreeLibrary。

    一般地,對(duì)于DLL程序的使用過(guò)程按照這樣的步驟進(jìn)行:

    首先,客戶程序使用LoadLibrary函數(shù)裝入DLL,該函數(shù)返回模塊的實(shí)例句柄,供以后操作該模塊使用。

    然后,客戶程序可以調(diào)用GetProcAddress函數(shù)獲得DLL中引出的函數(shù)的地址,我們既可以按函數(shù)的序號(hào)(在DEF文件中指定)也可以按函數(shù)的名字來(lái)獲取引出函數(shù)的地址,因?yàn)榭蛻舫绦蚝虳LL程序在相同的內(nèi)存地址空間中,所以客戶程序可以直接調(diào)用這些引出函數(shù)。

    最后FreeLibrary,把DLL程序卸出內(nèi)存,以便釋放資源。

    說(shuō)明:

    (1) DLL程序不僅可以引出函數(shù),也可以引出全局變量,因?yàn)榭蛻舫绦蚝虳LL程序在同一個(gè)地址空間,所以,把DLL中的全局變量引出到客戶程序中是有意義的。引用的方法并不復(fù)雜,或者把變量名放到DEF文件的EXPORTS部分,并加上DATA選項(xiàng); 或者在變量說(shuō)明前面加上_declspec(dllexport)說(shuō)明符。

    (2) DumpBin 通過(guò)/Exports選項(xiàng)可以列出DLL程序中的所有被引出的信息。

    (3) 客戶程序本身也可以是一個(gè)DLL程序,但它一定先被裝入到進(jìn)程空間中,以便可以調(diào)用系統(tǒng)函數(shù)操作作為服務(wù)程序的DLL模塊。

    進(jìn)程外組件
    因?yàn)檫M(jìn)程外組件程序和客戶程序位于不同的進(jìn)程空間之中,他們使用不同的地址空間,所以組件和客戶之間的通信必須跨越進(jìn)程邊界,這就涉及到以下一些問(wèn)題:

    (1) 一個(gè)進(jìn)程如何調(diào)用另外一個(gè)進(jìn)程中的函數(shù)

    (2) 參數(shù)如何從一個(gè)進(jìn)程被傳遞到另外一個(gè)進(jìn)程中

    Windows平臺(tái)上,在不同進(jìn)程之間進(jìn)行通信的辦法很多,包括DDE, named pipe,或者共享內(nèi)存等等,COM采用了LPC(Local Procedure Call)和RPC(Remote Procedure Call)

    RegEdit可檢查CLSID子鍵下的COM對(duì)象(63頁(yè))
    Microsoft Visual C++提供OleView.exe,可列出當(dāng)前機(jī)器上的所有類(lèi)別信息,以及每一種類(lèi)別下的組件對(duì)象列表。

    RegSvr32 D:\DicComp\DictComp.dll

    RegSvr32 /u D:\DicComp\DictComp.dll

    DLL組件必須有DllRegisterServer和DllUnregisterServer兩個(gè)用于注冊(cè)的入口函數(shù),才能用RegSvr32注冊(cè)。

    COM規(guī)定,支持自注冊(cè)的進(jìn)程外組件必須支持兩個(gè)命令行參數(shù)/RegServer和/UnregServer,以便完成注冊(cè)或注銷(xiāo)操作。
    Class Factory

    實(shí)際上,客戶程序并不直接調(diào)用組件程序的引出函數(shù),它調(diào)用COM庫(kù)的函數(shù)進(jìn)行組件對(duì)象的創(chuàng)建工作,COM庫(kù)的創(chuàng)建函數(shù)根據(jù)注冊(cè)表的信息調(diào)用組件程序的入口函數(shù)來(lái)創(chuàng)建組件對(duì)象。組件程序需要提供一個(gè)標(biāo)準(zhǔn)的入口函數(shù)DLLGetObjectClass,用于提供本組程序的組件信息。

    Class Factory和DLLGetObjectClass函數(shù)
    類(lèi)廠是COM對(duì)象的生產(chǎn)基地,COM庫(kù)通過(guò)類(lèi)廠創(chuàng)建COM對(duì)象; 對(duì)應(yīng)每一個(gè)COM類(lèi),有一個(gè)類(lèi)廠專(zhuān)門(mén)用于該COM類(lèi)的對(duì)象創(chuàng)操作。類(lèi)廠本身也是一個(gè)COM對(duì)象,它支持一個(gè)特殊的接口:IClassFactory,其定義如下:

    Class IClassFactory : public IUnknown

    {
    virtual HRESULT _stdcall CreateInstance(IUnknown *pUnknownOuter, const IID& iid, void **ppv) = 0;
    virtual HRESULT _stdcall LockServer(BOOL bLock) = 0;

    };

    接口IClassFactory有一個(gè)重要的成員函數(shù)CreateInstance,用于創(chuàng)建對(duì)應(yīng)的COM對(duì)象。因?yàn)槊總€(gè)類(lèi)廠之針對(duì)特定的COM類(lèi)對(duì)象,所以CreateInstance成員函數(shù)知道該創(chuàng)建什么樣的COM對(duì)象。在CreateInstance成員函數(shù)的參數(shù)中,第一個(gè)參數(shù)pUnknownOuter用于對(duì)象被聚合的情形,沒(méi)有聚合設(shè)成NULL。IClassFactory的另一個(gè)成員函數(shù)LockServer用于控制組建的生存周期。

    因?yàn)轭?lèi)廠本身也是個(gè)COM對(duì)象,它被用于其它COM對(duì)象的創(chuàng)建過(guò)程,那么類(lèi)廠對(duì)象又由誰(shuí)來(lái)創(chuàng)建呢?答案是DLLGetClassObject引出函數(shù)。DLLGetClassObject函數(shù)并不是COM庫(kù)的函數(shù),而是由組件程序?qū)崿F(xiàn)的引出函數(shù),我們先看一下DLLGetClassObject函數(shù)的原型:

    HRESULT DLLGetClassObject(const CLSID& clsid,
    Const IID& iid,
    (void **) ppv
    );

    COM庫(kù)在接到對(duì)象創(chuàng)建的指令后,它要調(diào)進(jìn)程內(nèi)組件的DLLGetClassObject函數(shù),由該函數(shù)創(chuàng)類(lèi)廠對(duì)象,并返回類(lèi)廠對(duì)象的接口指針,COM庫(kù)或者客戶一旦有了類(lèi)廠的接口指針,它們就可以通過(guò)類(lèi)廠接口IClassFactory的成員函數(shù)CreateInstance創(chuàng)建相應(yīng)的COM對(duì)象。

    COM庫(kù)與類(lèi)廠的交互(67頁(yè))
    在COM庫(kù)中,有三個(gè)API函數(shù)可用于對(duì)象的創(chuàng)建,它們分別是CoGetClassObject, CoCreateInstance和CoCreateInstanceEx。通常情況下,客戶程序調(diào)用其中之一完成對(duì)象的創(chuàng)建,并返回對(duì)象的初始接口指針。COM庫(kù)與類(lèi)廠也通過(guò)這三個(gè)函數(shù)進(jìn)行交互。

    將COM組件看成是DLL這種想法是十分膚淺的!

    DLL是COM組件的一種發(fā)布形式,是一個(gè)組件服務(wù)器。

    組件應(yīng)看成是DLL中所實(shí)現(xiàn)的接口集!

    DLL是一種形式,COM組件才是實(shí)質(zhì)。

    參考資料:http://hi.baidu.com/ella_qing/blog/item/de73eef8d66c7d0dd9f9fd3e.html

    第一:
    確切的來(lái)說(shuō)COM是一種技術(shù),不能說(shuō)就是類(lèi),或者類(lèi)的容器,一般一個(gè)COM組件會(huì)以一個(gè)DLL,OCX或者其他形式出現(xiàn)。一個(gè)COM組件里根據(jù)不同的需要可以包含一個(gè)類(lèi)或者多個(gè)類(lèi)。
    Active控件是一種特殊的COM組件,二者不能直接劃等號(hào),COM組件的范圍大。

    第二:
    首先還是要說(shuō)COM不能直接說(shuō)成是一個(gè)類(lèi)^_^,我們沒(méi)法像普通的類(lèi)一樣聲明對(duì)象,然后使用,這是COM的特性決定的,一個(gè)可以使用的COM,在使用之前要現(xiàn)在系統(tǒng)中注冊(cè),注冊(cè)的時(shí)候,會(huì)把COM組件的信息寫(xiě)入到注冊(cè)表里,我們使用的時(shí)候要?jiǎng)?chuàng)建實(shí)例。

    第三:
    COM本身就是一種技術(shù),COM的技術(shù)實(shí)現(xiàn)用到了接口這種方案,假設(shè)COM是一個(gè)類(lèi),接口可以近似看成內(nèi)部類(lèi)的父類(lèi),也有可能是工廠類(lèi)等。

    另外,COM的實(shí)現(xiàn)用到了抽象類(lèi),接口這種方法。

    詳細(xì)的,樓主可以到下面的網(wǎng)址去看,我感覺(jué)寫(xiě)的很不錯(cuò),我知道的也不多,只能說(shuō)出這些來(lái),再多的就答不好了,大家可以多交流^_^

    http://www.vckbase.com/document/viewdoc/?id=1483

    樓主連這個(gè)都不同,就不要去做程序員了,可惜你交的幾年學(xué)費(fèi)了,呵呵
    ActiveX是Microsoft對(duì)于一系列策略性面向?qū)ο蟪绦蚣夹g(shù)和工具的稱(chēng)呼,其中主要的技術(shù)是組件對(duì)象模型(COM)。在有目錄和其它支持的網(wǎng)絡(luò)中,COM變成了分布式COM(DCOM)。在創(chuàng)建包括ActiveX程序時(shí),主要的工作就是組件,一個(gè)可以自足的在ActiveX網(wǎng)絡(luò)(現(xiàn)在的網(wǎng)絡(luò)主要包括Windows和Mac)中任意運(yùn)行的程序。這個(gè)組件就是ActiveX近控件。ActiveX是Microsoft為抗衡Sun Microsystems的JAVA技術(shù)而提出的,此控件的功能和JAVA applet功能類(lèi)似。

    如果您使用的是Windows操作系統(tǒng),您或許會(huì)注意到一些以O(shè)CX結(jié)尾的文件。OCX代表“對(duì)象鏈接與嵌入控件”(OLE),這個(gè)技術(shù)是Microsoft提出的程序技術(shù),用于處理桌面文件的混合使用。現(xiàn)在COM的概念已經(jīng)取代OLE的一部分,Microsoft也使用ActiveX控件代表組件對(duì)象。

    組件的一大優(yōu)點(diǎn)就是可以被大多數(shù)應(yīng)用程序再使用(這些應(yīng)用程序稱(chēng)為組件容器)。一個(gè)COM組件(ActiveX控件)可由不同語(yǔ)言的開(kāi)發(fā)工具開(kāi)發(fā),包括C++和Visual Basic或PowerBuilder,甚至一些技術(shù)性語(yǔ)言如VBScript。

    組件是一個(gè)獨(dú)立發(fā)布的二進(jìn)制單元,在windows平臺(tái)上多以dll或exe的形式發(fā)布。組件分進(jìn)程內(nèi)組件和進(jìn)程外組件。而接口是客戶程序訪問(wèn)組件的唯一途徑,客戶只有通過(guò)組件提供的接口訪問(wèn)組件。類(lèi)廠其實(shí)開(kāi)發(fā)人員不用關(guān)心,因?yàn)槟鞘遣僮飨到y(tǒng)的COM服務(wù)層所做的事情。

    我,希望對(duì)你有幫助

    相關(guān)評(píng)說(shuō):

  • 費(fèi)曼19316832658: vc++ 求兩數(shù)中較大的數(shù) 有個(gè)什么和號(hào) 怎么打? 或者幫我寫(xiě)出來(lái). -
    弓長(zhǎng)嶺區(qū)異步: ______ 有很多方法,循環(huán),條件判斷等等,如果是多個(gè)數(shù)據(jù)排序,就最好用循環(huán),兩個(gè)數(shù)據(jù)就用條件判斷語(yǔ)句最簡(jiǎn)單,條件判斷符號(hào)為“?”,假設(shè)有這樣的語(yǔ)句:語(yǔ)句1?語(yǔ)句2:語(yǔ)句3; 那么意思就是如果語(yǔ)句1成立,則把語(yǔ)句2賦值到函數(shù)中,語(yǔ)句1...
  • 費(fèi)曼19316832658: 各種軟件語(yǔ)言的比較 -
    弓長(zhǎng)嶺區(qū)異步: ______ 你是說(shuō) 編出來(lái)的程序 是可視化的嗎?VB比較淺,功能也有限.MFC(就是提供微軟基礎(chǔ)類(lèi)庫(kù)的C++提供)功能比較強(qiáng)大.他們都能編出Windows環(huán)境下的視窗程序.
  • 費(fèi)曼19316832658: 用VC++6.0編程輸入10個(gè)學(xué)生某門(mén)課的成績(jī),然后按與輸入次序相反的順序輸出成績(jī). -
    弓長(zhǎng)嶺區(qū)異步: ______ 建立一個(gè)數(shù)組int array[10];輸入for(i=0;i++;i<10){cin>>array[i];}后將數(shù)組倒序輸出for(i=10;i--;i>=0){count<<ar...
  • 費(fèi)曼19316832658: 一套VC++6.0的作業(yè)題,幫忙,100分(又好又快的追加分?jǐn)?shù)哦)!!!!!
    弓長(zhǎng)嶺區(qū)異步: ______ 哦,早知道你叫別人做了我就不用做了啊,害的我這么晚還來(lái)做,哎~既然做了還是貼在上面吧,自己參考參考哦 //第一道題: #include"stdio.h" #include"windows.h" #include"iostream.h" int main(int argc,char* argv[]){ if(argv[2]=="...
  • 費(fèi)曼19316832658: vc++和c++有什么區(qū)別? -
    弓長(zhǎng)嶺區(qū)異步: ______ C++和VC++的關(guān)系,如同開(kāi)車(chē)技術(shù)和一輛大眾車(chē)的關(guān)系一樣,C++是一門(mén)具體的面向?qū)ο蟮恼Z(yǔ)言,對(duì)C語(yǔ)言做了封裝,在一般的軟件開(kāi)發(fā)中比較常用,而VC++是Microsoft推出的一款基于C++語(yǔ)言的軟件開(kāi)發(fā)工具,這就好比你掌握了開(kāi)車(chē)技術(shù)以...
  • 費(fèi)曼19316832658: C,C++和VC++的區(qū)別 -
    弓長(zhǎng)嶺區(qū)異步: ______ C++ 是個(gè)標(biāo)準(zhǔn),眾多軟件公司,在這個(gè)標(biāo)準(zhǔn)之上開(kāi)發(fā)出各種各樣的開(kāi)發(fā)工具 VC++ 是其中之一 也是用的最多的 VC++ 和C++的區(qū)別,就是多了很多類(lèi)庫(kù),比如你想做個(gè)桌子 C++里只規(guī)定你桌子是木頭的,也就是只能用木頭做(只能用for if int float 這個(gè)樣的做) 你必須親自去森林里看樹(shù),扒皮,裁切之類(lèi)的. 兒VC++里有木板,木棍,螺絲,板子,鉗子,你往一塊組合即可 (這些木棍,木板,就是類(lèi)庫(kù)) 優(yōu)點(diǎn)是你不用學(xué)伐木就可以做桌子,C++里你必須先伐木 當(dāng)然在VC++里也是要經(jīng)過(guò)伐木的過(guò)程,但不是你.~~
  • 費(fèi)曼19316832658: vc高手進(jìn)來(lái)(200分) -
    弓長(zhǎng)嶺區(qū)異步: ______ colors[i+1][1]= i/20.0表示什么意思,怎么算的? 我做vc++和OPENGL結(jié)合的三維平臺(tái),有
  • 費(fèi)曼19316832658: keil和vc++,單片機(jī)編程 -
    弓長(zhǎng)嶺區(qū)異步: ______ 1、從編程思路的角度說(shuō),單片機(jī)上用keil編程,和用VC++編程沒(méi)什么不同;2、二者語(yǔ)言規(guī)則不同;3、主要不同在于二者針對(duì)的對(duì)象不同,所以編譯架構(gòu)也就不同.不一定非要用keil,也有很多別的編...
  • www免费视频在线观看播放| 亚洲精品国产综合久久一线| 国产无人区二卡三卡四卡不见星空| 噼里啪啦在线影视免费观看| 色婷婷亚洲婷婷七月中文字幕| 人妻体内射精一区二区三四| 日韩精品极品视频在线观看免费| 丁香花在线视频完整版| 99久久丫E6| 让少妇高潮无乱码高清在线观看|