文章原始出处 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,以便对从客户传来的数据进行散集。
存根也将对传回给客户的数据进行列集。