Com也是國際頂級域名。Com,company的縮寫,是最常用的頂級域名,表示壹個商業網站。
[編輯本段]COM組件
什麽是COM組件
COM是組件對象模型的縮寫。
用戶需要什麽樣的軟件產品?這是個選擇題,但是高效和健壯肯定會選。壹個軟件開發者怎麽做才能滿足用戶的需求?需要確保在升級應用程序時不會破壞與以前版本的向後兼容性。有必要獨立於特定的操作系統來擴展系統服務。面向對象編程顯然是壹個革命性的變化。利用面向對象的設計方法,我們可以很容易地把要解決的問題抽象成各種類,並隱藏內部動作,只提供壹些接口。但這並沒有完全解決我們的問題。昨天在《程序員》雜誌上看到現在是後OO時代,那麽OO之後會是什麽呢?它應該是面向組件的。
雷神剛剛看完《COM技術內幕》這本書,整理了壹個FAQ,供大家學習這本書時參考。
這是第壹部分,包括前三章。
FAQ1:什麽是COM組件?[第壹章]
FAQ2:組件不是...?[第壹章]
FAQ3:什麽是接口?[第二章]
FAQ4:界面的作用是什麽?[第二章]
FAQ5:什麽是我不知道的?[第三章]
FAQ6:QueryInterface的作用是什麽?[第三章]
FAQ7:QueryInterface函數的實現規則是什麽?[第三章]
常見問題8:查詢界面是什麽樣子的?[第三章]
FAQ9:QueryInterface函數的參數IID是什麽?[第三章]
FAQ10:我什麽時候需要創建新的COM組件版本?[第三章]
問題:
什麽是COM組件?
回答:
COM組件由以WIN32動態鏈接庫(DLL)或可執行文件(EXE)形式發布的可執行代碼組成。
com組件是按照COM規範編寫的。
COM組件是小的二進制可執行文件。
COM組件可以為應用程序、操作系統和其他組件提供服務。
自定義COM組件可以在運行時與其他組件連接,形成壹個應用程序。
COM組件可以動態地插入或卸載應用程序。
COM組件必須動態鏈接。
COM組件必須隱藏(封裝)它們的內部實現細節。
COM組件必須隱藏它們實現的語言。
COM組件必須以二進制形式發布。
COM組件必須能夠在不幹擾現有用戶的情況下升級。
COM組件可以透明地在網絡上重新定位。
COM組件以標準的方式宣布它們的存在。
問題:
該組件不是...?
回答:
COM組件不是壹種計算機語言。
COM組件不是dll,只是用dll給組件提供動態鏈接的能力。
COM組件不是API函數集。
COM組件不是壹個類。
問題:
什麽是接口?
回答:
接口提供兩個不同對象之間的連接。
計算機程序由壹組函數連接,這些函數定義了程序不同部分的接口。
DLL的接口就是它輸出的函數。
C++類的接口就是這個類的成員函數集。
COM中的接口是由組件實現並提供給客戶的壹組功能。
在COM中,接口是包含函數指針數組的內存結構,數組元素是由組件實現的函數地址。
問題:
接口的作用是什麽?
回答:
對於組件,如何將它們連接起來形成壹個應用程序需要接口。
在COM中,接口就是壹切。對客戶來說,組件就是接口集,客戶只能通過接口與組件打交道。
這表明該接口可以保護系統免受外部變化的影響。這就是包裝的體現。
接口實現使用戶能夠以相同的方式處理不同的組件。這就是多態性的體現。
問題:
接口怎麽實現?
回答:
COM接口在C++中用純抽象基類實現。
壹個COM組件可以支持多個接口。
壹個C++類可以使用多重繼承來實現壹個支持多重接口的組件。
組件可以支持任意數量的接口。
接口應該是不變的。升級組件時,不應修改原有接口,而應添加新接口。
應該仔細設計實現接口,以便它可以支持各種實現。
問題:
我知道什麽?
回答:
IUnKnown是壹個接口。
所有COM接口都繼承IUnKnown。
IUnKnown是在WIN32 SDK的UNKNWN頭文件中定義的。
///I unknown的定義
接口未知
{
虛擬HRESULT __stdcall QueryInterface(常量IID & amp;iid,void * * PPV)= 0;
虛擬ULONG _ _ stdcall AddRef()= 0;
虛擬ULONG _ _ stdcall Release()= 0;
}
問題:
QueryInterface的作用是什麽?
回答:
QueryInterface是IUnKnown的成員函數,客戶可以通過它查詢壹個組件是否支持特定的接口。
QueryInterface函數返回壹個指向組件支持的接口的指針。
如果QueryInterface函數沒有找到組件支持的接口,則返回指針為空。
QueryInterface函數可以用if…then…else語句、數組、哈希表、樹來實現。
QueryInterface函數不能使用case語句,因為QueryInterface函數返回的是HRESULT結構而不是數字。
QueryInterface也是壹種解封組件版本的機制。這種機制使新舊版本的組件能夠互操作。
問題:
QueryInterface函數的實現規則是什麽?
回答:
QueryInterface返回的IUnKnown指針總是相同的。
如果壹個客戶得到了壹個接口,它總是可以得到的。
客戶可以再次獲得他們已經擁有的界面。
客戶可以返回到開始界面。
如果在壹個接口上可以獲得壹個特定的接口,那麽這個接口可以從任何接口上獲得。
問題:
QueryInterface函數的參數IID是什麽?
回答:
它是壹個結構,壹個接口標識符結構。
IID確定客戶需要的接口。
每個接口都有唯壹的接口標識符。因此,與IID相對應的界面永遠不會改變。
接口IID決定COM組件的版本。
不同的接口有不同的id,包括不同版本的接口。
問題:
我什麽時候需要創建新版本的COM組件?
回答:
為現有接口指定新ID時,至少應滿足以下條件之壹。
當界面中的功能數量發生變化時。
界面中功能的順序已經改變。
接口中函數的參數已經改變。
接口中函數參數的順序已經改變。
接口中函數的參數類型已更改。
接口中函數的返回值發生變化。
接口中函數的返回值類型已更改。
界面中函數參數的含義發生變化。
界面中功能的含義發生了變化。
簡單地說,COM是壹種跨應用程序和語言享受二進制代碼的方式。與C++不同,它提倡源代碼重用。ATL就是壹個很好的例子。源碼級復用雖然好,但是只能用在C++裏。也帶來了名稱沖突的可能,更不用說代碼的不斷復制和重用,導致項目的膨脹和臃腫。
Windows使用dll來享受二進制級別的代碼。這也是運行Windows程序的關鍵——重用kernel32.dll、user32.dll等。但dll是為C接口編寫的,只能由C或理解C調用規範的語言使用。編程語言負責實現代碼,而不是dll本身。在這種情況下,dll的使用受到限制。
MFC引入了另壹種MFC擴展dll二進制* * *共享機制。但它的用途仍然有限——只能在MFC程序中使用。
COM通過定義二進制標準來解決這些問題,即COM明確指出二進制模塊(dll和exe)必須編譯成與指定的結構相匹配。該標準還明確規定了如何在內存中組織COM對象。COM定義的二進制標準也必須獨立於任何編程語言(比如C++中的命名修飾)。壹旦滿足這些條件,就可以從任何編程語言輕松訪問這些模塊。編譯器負責生成的二進制代碼與標準的兼容性。這使得後來的人更容易使用這些二進制代碼。
在內存中,這種標準形式的COM對象偶爾會在C++虛函數中使用,所以這就是為什麽很多COM代碼使用C++的原因。但是請記住,編寫模塊的語言是不相關的,因為生成的二進制代碼在所有語言中都是可用的。
此外,COM不是Win32獨有的。理論上可以移植到Unix或者其他操作系統上。但是好像沒聽說過Windows之外的COM。
[編輯本段] com英文版
1表示* * *相同或相同,意為“* * *相同、相互、在壹起”;
此外,還有col、cor、co、syn、sym、syl、syr另壹個超級表* * *與對方;Homo表壹樣,壹樣;因為表是相同和相似的;Iso表等。
2.它意味著加強或擴展意思;
類似的前綴有:be,a,ac,af,en,em,col,cor。
com-和con-前綴的意思是“* * *在壹起”。如連接、合並、戰鬥等。
根據在英英詞典中查找com的意思,它給出的解釋是,當它以。com,就是業務相關的意思。
根據我後來在網上找到的詞源中的解釋,com是* * *的意思,是co和con的同義詞。