我的COM學習筆記 (轉)

worldblog發表於2008-01-21
我的COM學習筆記 (轉)[@more@]

下面這個東西是我在01年學習COM時的一個筆記,原來發表在社群裡,並被收入C/C++板塊的精華區中。近日重拾COM,將它稍做修改,挪到這裡,以便查詢。

=====================================

2001.5.30
1.何謂?
元件(component)就是一個模組,專門用來完成特定的預定工作,實現二進位制級的程式碼複用。

 
2.何謂COM?
COM,即Component Model(元件模型)。它不是語言,而是一套構造二進位制相容軟體元件的規範。依照這個規範可以建立能夠相互通訊的軟體元件,而不管這些元件使用什麼語言或工具建立的。


3.COM術語
元件程式碼(Component Code):就是實現元件功能的程式碼。
介面(Interface):是一組公用功能定義,是元件向或其他元件提供的,用來說明本元件的功能,以及如何使用這些功能的方法集。
GUID(Globally Unique ntifier,全域性唯一識別符號):為一個128位整數,用來向操作和應用程式唯一標識這個元件。
二進位制相容性(Binary compatibility):無論元件用什麼語言建立,它都與其它COM元件相容和可供其他元件使用。


4.應返回HRESULT
COM介面的所有方法,除IUnKnown::AddRef和IUnKnown::Release外,返回型別都應為HRESULT,HRESULT是狀態碼。可以用Getde()將此狀態碼轉換成更詳細的SCODE。

 
5.COM元件的實現規則
實現IUnKnown規則
管理規則:管理記憶體就是管理指標。
引用計數規則


2001-5-31
1.如何實現自定義介面?
利用MIDL( Interface Definition Language),它是基於Open Software Foundation Distributed Computing Environment 的 Remote Procedure Call IDL。

 
2.IDL
import "oaidl.idl";//此檔案包括IDispatch介面的定義,import相當於#include
import "ocidl.idl";

[
  object,//COM介面定義
  //ICTAddIn介面唯一識別符號(GUID)
  uuid(9EDADF6F-C069-11D1-A446-0000E8D2CD0A),
  dual,//表示客戶機可用兩種方法訪問這個介面
  helpstring("ICTAddIn Interface"),//將提示字串與此介面建立聯絡
  pointer_default(unique)//指定除參數列中所列屬性之外所有指標的預設特徵,unique表示指標可以是NULL,但不支援別名
]
interface ICTAddIn : IDispatch
{
  [id(1), helpstring("Insert code template.")] HRESULT CTInsCodeTmpl();
};
[
  uuid(9EDADF62-C069-11D1-A446-0000E8D2CD0A),
  version(1.0),
  helpstring("CodeTmpl Add-in Type Library")
]
library CODETMPLLib //型別庫
{
  importlib("stdole32.tlb");
  importlib("stdole2.tlb");

  importlib("devshl.dll");
  importlib("idedevg.pkg");

[
  uuid(9EDADF70-C069-11D1-A446-0000E8D2CD0A),
  helpstring("CodeTmpl - Code Template Add-in")
]
coclass CTAddIn //元件類
{
  [default] interface ICTAddIn;
};
};


3.用ATL建立COM
要用ATL建立COM元件,就要生成從至少另外兩個類派生的類:CComObject和
CComCoClass。此外,還要從你的類派生CComObject類。

最後整理:-6-26 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997875/,如需轉載,請註明出處,否則將追究法律責任。

相關文章