文章原始出處 http://www.ai361.com
原文標題大概是 Notes----《COM技術內幕》
作者 雷神
這是雷神剛剛讀完《COM技術內幕》一書,整理的一個FAQ 中的兩個:
Question:
什麼是IDL和MIDL?
Answer:
IDL是介面定義語言。
MIDL是Microsoft的IDL編譯器。
在用IDL對介面和組件進行了描述後,可以用MIDL進行編譯,產生相應的代理和存根DLL的C代碼。
一個例子:
import “unknown.idl” ///用於將其他IDL檔案中的定義包含到當前檔案中
///Interface IX
[ ///注意是[ ]不是 {}
object, ///所定義的介面是一個COM介面
uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相應的介面IID
helpstring(“IX Interface”), ///將協助串放入類型庫
pointer_default(unique) ///這類指標可以為空白,函數內可以修改它們的值,但不能指定別名
]
interface IX:IUnknown
{
///in關鍵字告訴MIDL需要將此參數值從客戶傳遞給組件,存根代碼不需要送回任何值。
HRESULT FxStringIn([in,string]wchar_t* szIn);
///out關鍵字告訴MIDL參數僅被用來從組件向客戶傳回有關的資料,
///代理不需要對輸出參數進行列集,也不需要將參數傳給組件。
HRESULT FxStringOut([out,string]wchar_t* szout);
///COM對字串的標準約定是Unicode字元(即wchar_t)
}
IDL檔案可以定義C和C++風格的結構,並可用它們作為函數的參數。
當IDL檔案中有一個library時,MIDL將產生一個類型庫。
MIDL為介面產生相應的代理和存根的C代碼。
為得到一個代理/存根DLL,需要編譯和連結MIDL產生的C檔案。
宏REGISTER_PROXY_DLL將完成代理/存根DLL在註冊表中的註冊操作。
有了IDL和MIDL我們就可以象調用進程內組件那樣進行跨進程邊界的函數調用,並對參數進行列集。
Question:
什麼是代理和存根DLL?
Answer:
客戶與一個模仿組件的DLL進行通訊,這個DLL可以完成參數的列集,此組件被稱為代理。
一個代理就是同另一個組件行為相同的組件。
代理必須是DLL形式。
組件還需要一個存根的DLL,以便對從客戶傳來的資料進行散集。
存根也將對傳回給客戶的資料進行列集。