欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

什么是COM

系統 1770 0

com即組件對象模型,是component object model取前三個字母的縮寫,這三個字母在當今Windows的世界中隨處可見。隨時涌現出來的大把大把的新技術都以com為基礎。各種文檔中也充斥著諸如com對象、接口、服務器之類的術語。因此,對于一個程序員來說,不僅要掌握使用com的方法,而且還要徹底熟悉com的所有一切。

?com到底是什么?

簡單地說,com是一種跨應用和語言共享二進制代碼的方法。與C++不同,他提倡源代碼重用。ATL便是一個很好的例證。源碼級重用雖然好,但只能用于C++.他還帶來了名字沖突的可能性,更不用說不斷拷貝重用代碼而導致工程膨脹和臃腫。

windows使用dlls在二進制級共享代碼。這也是Windows程序運行的關鍵——重用kernel32.dll,user32.dll等。但dlls是針對C接口而寫的,它們只能被C或者理解C調用規(guī)范的語言使用。由編程語言來負責實現代碼共享,而不是由dlls本身。這樣的話DLLs的使用受到限制。

MFC引入了另外一種MFC擴展DLLs二進制機制。但是他的使用仍受到限制——只能在MFC程序中使用。

com通過二進制標準解決了這些問題,即COM明確指出二進制模塊(DLLs和EXEs)必須被編譯成與指定的結構匹配。這個標準也確切規(guī)定了在內存中如何組織COM對象。COM的定義的二進制標準還必須獨立于任何語言(如C++中的命名修飾)。一旦滿足了這些條件,就可以輕松地從任何編程語言中存取這些模塊。由編譯器負責所產生的二進制代碼與標準兼容。這樣使后來的人能更容易地使用這些二進制代碼。

在內存中,COM對象的這種標準形式在C++虛函數中偶爾用到,所以這就是為什么許多COM代碼使用C++的原因。但是記住,編寫模塊所用的語言是無關的,因為結果二進制代碼為所有語言可用。
  此外,COM不是Win32特有的。從理論上講,它可以被移植到Unix或其它操作系統。但是我好像還從來沒有在Windows以外的地方聽說過COM。

?

基本元素的定義

我們從下往上看。接口不過是一組函數。這些函數被稱為方法。接口名字以大寫字母I開頭,例如C++中的IShellLink,接口被設計成一個抽象基類,其中只有純粹的虛擬函數。

接口可以從其它接口繼承,這里所說的繼承的原理就好像C++中的單繼承。接口是不允許多繼承的。

coclass(簡稱組件對象類——component object class)被包含在DLL或EXE中,并且包含著一個或者多個接口的代碼。組件對象類(coclass)實現這些接口。COM對象在內存中表現為組件對象類(coclass)的一個實例。注意COM“類”和C++“類”是不相同的,盡管常常COM類實現的就是一個C++類。

COM服務器是包含了一個或多個coclass的二進制(DLL或EXE)。

注冊(Registration)是創(chuàng)建注冊表入口的一個過程,告訴Windows操作系統COM服務器放在什么位置。取消注冊(Unregistration)則相反——從注冊表刪除這些注冊入口。

GUID(諧音為“fluid”,意思是全球唯一標示符——globally unique identifier)是一個128位的數字。他是一種獨立于COM編程語言的標示方法。每一個接口和coclass有一個GUID.因為每一個GUID都是全球唯一的,所以避免了名字沖突(只要你用COM API創(chuàng)建它們)。有時你還會碰到另一個術語UUID(意思也是全球唯一標示符——universally unique identifier)。UUIDs和GUIDs在實際使用時的用途是一樣的。

類ID或者CLSID是命名coclass的GUID。接口ID或者IID是命名接口的GUID。

在COM中廣泛地使用GUID有兩個理由:

  1. GUIDs只是簡單的數字,任何編程語言都可以對之進行處理;
  2. GUIDs可以在任何機器上被任何人創(chuàng)建,一旦完成創(chuàng)建,它就是唯一的。因此,COM開發(fā)人員可以創(chuàng)建自己特有的GUIDs而不會與其它開發(fā)人員所創(chuàng)建的GUIDs有沖突。這樣就消除了集中授權發(fā)布GUIDs的必要。

  HRESULT是COM用來返回錯誤和成功代碼的整型數字。除此之外,別無它意,雖然以H作前綴,但沒有句柄之意。下文會對它有更多的討論。

最后,COM庫是在你使用COM時與你交互的操作系統的一部分,它常常指的就是COM本身。但是為了避免混淆才分開描述的。

?

使用和處理COM對象

每一種語言都有其自己處理對象的方式。例如,C++是在棧中創(chuàng)建對象,或者用new動態(tài)分配。因為COM必須獨立于語言,所以COM庫為自己提供對象管理例程。下面是對CoM對象管理和C++對象管理所做的一個比較。

創(chuàng)建一個新對象

C++中,使用new操作符,或者在棧中創(chuàng)建對象。

COM中,調用COM庫中的API。

刪除對象

C++中,用delete操作符,或者將棧對象踢出。

COM中,所有的對象保持它們自己的引用記數。調用者必須通知對象什么時候用完這個對象。當引用計數為零時,COM對象將自己從內存中釋放。

由此可見,對象處理的兩個階段:創(chuàng)建和銷毀,缺一不可。當創(chuàng)建COM對象時要通知COM庫使用哪一個接口。如果這個對象創(chuàng)建成功,COM返回所請求的接口的指針,然后通過這個指針調用方法,就像使用常規(guī)C++對象指針一樣。

?

創(chuàng)建COM對象

為了創(chuàng)建COM對象并從這個對象獲得接口,必須調用COM庫的API函數,CoCreateInstance().其原型如下:

HRESULT CoCreateInstance(

  REFCLSID rclsid,

  LPUNKNOWN pUnkOuter,

  DWORD dwClsContext,

  REFIID riid,

  LPVOID* ppv  

);

以下是參數解釋:

rclsid:coclass的CLSID,例如,可以傳遞CLSID_ShellLink創(chuàng)建一個COM對象來建立快捷方式。

pUnkOuter:這個參數只用于COM對象的聚合,利用它向現有的coclass添加新方法。參數為null表示不使用聚合。

dwClsContext:表示所使用COM服務器的種類。本文使用的是最簡單的COM服務器,一個進程內(in-process)DLL.所以傳遞的參數值為CLSTX_INPROC_SERVER.注意不要隨意使用CLSTX_ALL(在ATL中,它是缺省值)。因為在沒有安裝DCOM的Windows95系統上會導致失敗。

riid:請求接口的IID,例如,可以傳遞IID_IShellLink獲得IShellLink接口指針。

ppv:接口指針的地址。COM庫通過這個參數返回請求的接口。

?

?

?

?

什么是COM


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产真实精品久久二三区 | 午夜寂寞影院在线观看 | 亚洲97| 成人欧美一区二区三区在线播放 | 亚洲精品久久久久无码AV片软件 | 欧美日韩一区二区综合在线视频 | 久久精品一| 剑来高清在线观看 | 国产午夜精品久久久 | 亚洲激情一区 | 2017av伦理片 | 免费视频爱爱太爽了 | 国产精品久久久久久亚洲色 | 精品欧美亚洲韩国日本久久 | 久久精彩免费视频 | 久草久草久草 | 日韩欧美在线免费观看视频 | 国产福利一区二区 | 521国产精品视频 | 丁香婷婷久久久综合精品国产 | 刮伦人妇A片1级 | 黄色豆奶视频 | 久久久久久国产视频 | 欧洲精品视频完整版在线 | 国产精品极品美女自在线看免费一区二区 | 污视频在线观看网站 | 久久制服丝袜 | 精品免费国产一区二区三区 | 亚洲国产系列久久精品99人人 | 日韩欧美一区二区三区在线 | 亚洲一区二区三区91 | 日本中文在线观看 | 激情五月色综合色婷婷 | 日韩一区二区三区四区五区 | 精久久久| 欧美大片一区 | 日韩一级片在线免费观看 | 免费国产精品视频在线 | 国产资源一区 | 色婷婷六月丁香在线观看 | 国产农村妇女毛片精品久久麻豆 |