COM技术内幕:调度接口与自动化笔记——————
自定义接口:custom interface (vtbl接口/常规COM接口)
使用自定义接口时,由接口定义的那些方法都被定义在一个vtable中。对于vtable来说,只有那些方法入口才是有用的。
方法的顺序被定义在接口中。低级的vtbl接口可给C++程序员提供对组件进行有效聚合所需要的额外信息
调度接口:diapatch interface
脚本客户端不能处理自定义接口,它们只能使用调度接口。一个调度接口是一个
IDispatch接口的实现,它可以被脚本客户端理解,所以在编译时不需要知道接口的内存布局。
从方法名获得其ID,以及通过ID调用方法的这些映射机制是需要花时间的。而且除了这种映射机制,还有数据转换的过程。
Invoke仅接受一个参数,这个参数内包含的参数需要通过转换才能用来调用目标方法。
IDispatch::Invoke开销与参数调整的开销导致对于进程内组件效率远低于低级接口(100倍)对于进程外组件(2.5倍)远程组件(~1)
双重接口:dual interface
自定义接口可以提供最佳的性能,而调度接口可以被脚本客户端调用。为了两全其美,微软设计出了双重接口。双重接口从IDispatch接口派生,但是添加了一些新的方法到vtable中。只知道IDispatch的客户端可以使用它的GetIDsOfNames和Invoke方法来得到和访问那些方法指针,但是可以访问自定义接口的客户端也可以直接使用它们.
如果不是确实需要在运行时创建组件,不要去实现纯的dual interface.双重接口比调度接口要脆弱许多。
来源:CSDN
作者:numenshane1
链接:https://blog.csdn.net/numenshane1/article/details/5492692