• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            無我

            讓內(nèi)心永遠(yuǎn)燃燒著偉大的光明的精神之火!
            靈活的思考,嚴(yán)謹(jǐn)?shù)膶?shí)現(xiàn)
            豪邁的氣魄、頑強(qiáng)的意志和周全的思考

            【轉(zhuǎn)】什么是COM組件

            什么是COM組件

            用戶需要什么樣的軟件產(chǎn)品?這是一個(gè)多選題,但高效,健壯是肯定會(huì)被選種的。作為一名軟件開發(fā)人員如何做才能滿足用戶的需要呢?必須要保證升級(jí)應(yīng)用時(shí)不破壞與以前版本的向后兼容性。必須做到擴(kuò)展系統(tǒng)服務(wù)時(shí)不依賴特定的操作系統(tǒng)。面向?qū)ο蟮某绦蛟O(shè)計(jì)顯然是一次革命性的改變。采用面向?qū)ο蟮脑O(shè)計(jì)方法我們可以很容易的把要解決的問題事物抽象成各種類,并將內(nèi)部動(dòng)作封裝隱藏起來,只提供一些接口。但這并沒有完全解決我們的問題。昨天我在《程序員》雜志上看到,現(xiàn)在是后OO時(shí)代,那OO以后是什么呢?應(yīng)該是面向組件吧。

            雷神剛剛讀完《COM技術(shù)內(nèi)幕》一書,整理了一個(gè)FAQ,供大家在學(xué)習(xí)此書時(shí)參考。

            這是第一部分,包含前3章的內(nèi)容。

             

            FAQ1:什么是COM組件?〖第一章〗

            FAQ2:組件不是……?〖第一章〗

            FAQ3:什么是接口?〖第二章〗

            FAQ4:接口的作用是什么?〖第二章〗

            FAQ5:什么是IUnKnown? 〖第三章〗

            FAQ6QueryInterface函數(shù)的作用是什么?〖第三章〗

            FAQ7QueryInterface函數(shù)的實(shí)現(xiàn)規(guī)則是什么?〖第三章〗

            FAQ8QueryInterface的樣子?〖第三章〗

            FAQ9QueryInterface函數(shù)的參數(shù)IID是什么?〖第三章〗

            FAQ10:何時(shí)需要建立一個(gè)新的COM組件版本?〖第三章〗

             

            Question

            什么是COM組件?

            Answer:

            COM組件是以WIN32動(dòng)態(tài)鏈接庫(DLL)或可執(zhí)行文件(EXE)形式發(fā)布的可執(zhí)行代碼組成。

            COM組件是遵循COM規(guī)范編寫的

            COM組件是一些小的二進(jìn)制可執(zhí)行文件

            COM組件可以給應(yīng)用程序、操作系統(tǒng)以及其他組件提供服務(wù)

            自定義的COM組件可以在運(yùn)行時(shí)刻同其他組件連接起來構(gòu)成某個(gè)應(yīng)用程序

            COM組件可以動(dòng)態(tài)的插入或卸出應(yīng)用

            COM組件必須是動(dòng)態(tài)鏈接的

            COM組件必須隱藏(封裝)其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)

            COM組件必須將其實(shí)現(xiàn)的語言隱藏

            COM組件必須以二進(jìn)制的形式發(fā)布

            COM組件必須可以在不妨礙已有用戶的情況下被升級(jí)

            COM組件可以透明的在網(wǎng)絡(luò)上被重新分配位置

            COM組件按照一種標(biāo)準(zhǔn)的方式來宣布它們的存在

            Question

              組件不是……?

            Answer:

            COM組件不是一種計(jì)算機(jī)語言

            COM組件不是DLL,只是利用DLL來給組件提供動(dòng)態(tài)鏈接的能力

            COM組件不是一個(gè)API函數(shù)集。

            COM組件不是類

            Question

              什么是接口?

            Answer:

            接口就是提供兩個(gè)不同對(duì)象間的一種連接。

            計(jì)算機(jī)程序是通過一組函數(shù)而進(jìn)行連接的,這組函數(shù)就是定義了程序中不同部分的接口。

            DLL的接口就是它所輸出的那些函數(shù)。

            C++類的接口就是該類的成員函數(shù)集。

            COM中的接口是一組由組件實(shí)現(xiàn)的提供給客戶使用的函數(shù)。

            COM中接口是一個(gè)包含函數(shù)指針數(shù)組的內(nèi)存結(jié)構(gòu),數(shù)組元素是一個(gè)由組件實(shí)現(xiàn)的函數(shù)地址。

            Question

              接口的作用是什么?

            Answer:

              有了組件如何將它們連接起來構(gòu)成某個(gè)應(yīng)用程序,需要用接口。

              COM中接口就是一切,對(duì)客戶說組件就是接口集,客戶只能通過接口和組件打交道。

              說明接口可以保護(hù)系統(tǒng)免受外界變化的影響。這是封裝的體現(xiàn)。

              接口實(shí)現(xiàn)了使用戶使用同樣的方式來處理不同的組件。這是多態(tài)的體現(xiàn)。

             

            Question

              接口的如何實(shí)現(xiàn)?

            Answer:

              COM接口在C++中是用純抽象基類實(shí)現(xiàn)。

              一個(gè)COM組件可以支多個(gè)接口。

              一個(gè)C++類可以使用多重繼承來實(shí)現(xiàn)一個(gè)支持多個(gè)接口的組件。

              組件可以支持任意數(shù)目的接口。

            接口應(yīng)該具有不變性。在組件升級(jí)時(shí)應(yīng)該不修改原來的接口,而是添加新的接口。

            要精心設(shè)計(jì)實(shí)現(xiàn)接口,以使之能夠支持各種不同的實(shí)現(xiàn)。

             

            Question

              什么是IUnKnown?

            Answer:

              IUnKnown是一個(gè)接口。

              所有COM接口都繼承IUnKnown

              IUnKnown的定義在WIN32 SDK中的UNKNWN頭文件中。

              ///IUnKnown的定義

              interface IUnKnown

              {

                virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0;

                virtual ULONG __stdcall AddRef()=0;

                virtual ULONG __stdcall Release()=0;

              }

             

            Question

              QueryInterface函數(shù)的作用是什么?

            Answer:

              QueryInterfaceIUnKnown的成員函數(shù),客戶可以通過此函數(shù)來查詢組件是否支持某個(gè)特定的接口。

              QueryInterface函數(shù)返回一個(gè)指向組件支持的接口的指針。

              如果QueryInterface函數(shù)沒有找到組件支持的接口則返回指針是NULL

              QueryInterface函數(shù)可以使用ifthenelse語句、數(shù)組、散列表、樹來實(shí)現(xiàn)。

              QueryInterface函數(shù)不能使用case語句,因?yàn)?/span>QueryInterface函數(shù)返回的是一個(gè)HRESULT結(jié)構(gòu)而不是一個(gè)數(shù)。

            QueryInterface也是一種無封處理組件版本的機(jī)制。這種機(jī)制使得組件的新舊不同的版本可以互操作。

            Question

              QueryInterface函數(shù)的實(shí)現(xiàn)規(guī)則是什么?

            Answer:

              QueryInterface返回的IUnKnown指針總是相同。

              若客戶獲得了某個(gè)接口,那么它總能獲得此接口。

              客戶可以再次獲得已經(jīng)擁有的接口。

              客戶可以返回到起始接口。

              若能夠在某個(gè)接口獲得某個(gè)特定接口,那么從任意接口都將可以獲得此接口。

            Question

              QueryInterface函數(shù)的參數(shù)IID是什么?

            Answer:

              它是一個(gè)結(jié)構(gòu),接口標(biāo)識(shí)符結(jié)構(gòu)。

            IID標(biāo)識(shí)了客戶所需的接口。

              每一個(gè)接口都有一個(gè)唯一的接口標(biāo)識(shí)符。所以某個(gè)與IID相對(duì)應(yīng)的接口絕對(duì)不會(huì)發(fā)生變化。

              接口IID決定了COM組件的版本。

              不同的接口具有不同的ID,包括不同版本的接口。

             

            Question

              何時(shí)需要建立一個(gè)新的COM組件版本?

            Answer:

              當(dāng)為已有接口指定新的ID時(shí)應(yīng)該是下面的條件至少有一個(gè)成立。

              接口中函數(shù)的數(shù)目發(fā)生改變時(shí)。

              接口中函數(shù)的順序發(fā)生改變。

              接口中某個(gè)函數(shù)的參數(shù)發(fā)生改變

              接口中某個(gè)函數(shù)的參數(shù)的順序發(fā)生改變

              接口中某個(gè)函數(shù)的參數(shù)的類型發(fā)生改變

              接口中函數(shù)的返回值發(fā)生改變

              接口中函數(shù)的返回值類型發(fā)生改變

              接口中函數(shù)的參數(shù)的含義發(fā)生改變

              接口中函數(shù)的含義發(fā)生改變

            簡(jiǎn)單地說,COM是一種跨應(yīng)用和語言共享二進(jìn)制代碼的方法。與C++不同,它提倡源代碼重用。ATL便是一個(gè)很好的例證。源碼級(jí)重用雖然好,但只能用于C++。它還帶來了名字沖突的可能性,更不用說不斷拷貝重用代碼而導(dǎo)致工程膨脹和臃腫。

            Windows使用DLLs在二進(jìn)制級(jí)共享代碼。這也是Windows程序運(yùn)行的關(guān)鍵——重用kernel32.dll, user32.dll等。但DLLs是針對(duì)C接口而寫的,它們只能被C或理解C調(diào)用規(guī)范的語言使用。由編程語言來負(fù)責(zé)實(shí)現(xiàn)共享代碼,而不是由DLLs本身。這樣的話DLLs的使用受到限制。

            MFC引入了另外一種MFC擴(kuò)展DLLs二進(jìn)制共享機(jī)制。但它的使用仍受限制——只能在MFC程序中使用。

            COM通過定義二進(jìn)制標(biāo)準(zhǔn)解決了這些問題,即COM明確指出二進(jìn)制模塊(DLLsEXEs)必須被編譯成與指定的結(jié)構(gòu)匹配。這個(gè)標(biāo)準(zhǔn)也確切規(guī)定了在內(nèi)存中如何組織COM對(duì)象。COM定義的二進(jìn)制標(biāo)準(zhǔn)還必須獨(dú)立于任何編程語言(如C++中的命名修飾)。一旦滿足了這些條件,就可以輕松地從任何編程語言中存取這些模塊。由編譯器負(fù)責(zé)所產(chǎn)生的二進(jìn)制代碼與標(biāo)準(zhǔn)兼容。這樣使后來的人就能更容易地使用這些二進(jìn)制代碼。

            在內(nèi)存中,COM對(duì)象的這種標(biāo)準(zhǔn)形式在C++虛函數(shù)中偶爾用到,所以這就是為什么許多COM代碼使用C++的原因。但是記住,編寫模塊所用的語言是無關(guān)的,因?yàn)榻Y(jié)果二進(jìn)制代碼為所有語言可用。

            此外,COM不是Win32特有的。從理論上講,它可以被移植到Unix或其它操作系統(tǒng)。但是我好像還從來沒有在Windows以外的地方聽說過COM

             

            posted on 2007-10-28 10:38 Tim 閱讀(3375) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 資源共享

            <2007年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            本博客原創(chuàng)文章,歡迎轉(zhuǎn)載和交流。不過請(qǐng)注明以下信息:
            作者:TimWu
            郵箱:timfly@yeah.net
            來源:www.shnenglu.com/Tim
            感謝您對(duì)我的支持!

            留言簿(9)

            隨筆分類(173)

            IT

            Life

            搜索

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            久久精品国产亚洲综合色| 色婷婷久久久SWAG精品| 精品久久久久久国产91| 18岁日韩内射颜射午夜久久成人| 久久精品国产WWW456C0M| 欧美国产成人久久精品| 久久中文娱乐网| 久久精品国产99国产精品导航| 久久精品国产免费| 亚洲愉拍99热成人精品热久久| 久久香蕉国产线看观看乱码 | 久久精品国产亚洲av麻豆小说| 久久线看观看精品香蕉国产| 99精品国产99久久久久久97| 久久精品国产国产精品四凭| 99国产欧美精品久久久蜜芽| 久久久噜噜噜久久中文字幕色伊伊 | 久久亚洲2019中文字幕| 国产欧美一区二区久久| 亚洲精品无码久久久久| 2021国产精品久久精品| 亚洲精品97久久中文字幕无码| 色综合合久久天天综合绕视看| 人妻精品久久久久中文字幕69 | 精品久久久久久久久午夜福利| 欧美一级久久久久久久大| 丁香久久婷婷国产午夜视频| aaa级精品久久久国产片| 婷婷五月深深久久精品| 久久国产免费直播| 99久久无色码中文字幕人妻| 久久久久久久波多野结衣高潮| 久久久久久久久66精品片| 久久人搡人人玩人妻精品首页| 99热都是精品久久久久久| 久久91精品久久91综合| 九九99精品久久久久久| 99久久婷婷国产一区二区| www亚洲欲色成人久久精品| 国产香蕉97碰碰久久人人| 精品熟女少妇aⅴ免费久久|