COM 中的双接口是能够通过 DispInterface 或 VTable 方法访问的接口。
现在有人可以告诉我这两种方法之间到底有什么区别吗?
我认为 VTable 是一个虚拟表,它在实现具有可以在子类中覆盖的虚拟函数的类层次结构时保存指向不同函数的指针。但是我看不出这与 COM 中的双接口有什么关系?
主要区别在于调用对象方法的方式。如果 DispInterface 调用通过 IDispatch::Invoke 方法(在脚本中使用或在没有接口描述的情况下使用),请参阅备注。这种方法比第二种选择慢得多。第二种情况直接使用VTable进行方法调用(用于C++或.NET语言的调用)
我只想回答托尼的其他问题。
如果你想创建一个可以从 VBScript/JScript 或旧的“经典” ASP 访问的 COM,你必须实现 IDispatch。
在 Visual Basic 6 或 MS Office 的 VBA 中,可以同时使用这两种方式。如果您将引用添加到您的 COM,那么您将使用“早期绑定”(IUnknown 或 VTable)。如果您在 VB6 或 VBA 中使用带有 CreateObject(“ProgIdName”)的 COM,您将使用“后期绑定”。
了解使 COM 可以从 VB6/VBA 等访问是非常重要的。仅仅实现 IUnknown 接口是不够的。您必须使用oleautomation
属性创建和注册类型库。为此,您可以在您的 COM 接口中使用仅oleautomation
兼容的数据类型(请参阅http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspx)。为了理解类型库扮演客户端编组 DLL 的角色,因此它有助于 VB6/VBA 等客户端软件正确地将数据作为参数发送到您的 COM。您不要忘记,即使您的 COM 将是一个 InProc 服务器、一个 DLL,参数也不会直接转发到 COM,而是需要编组。在编组期间,将在运行 COM 的线程上创建数据副本。它使您的 COM DLL 线程从一侧安全,如果调用您的 COM 方法的线程将在 COM 返回值之前结束,您的 COM 不会崩溃。
可能我对编组的解释并不容易,但重要的是不要忘记创建和注册类型库,它最好保存为 COM 内部的资源。
简而言之,COM 是二进制规范,而不是语言规范。双接口和代码中的派生类之间确实没有关联。苹果和橙子。
VTable 是“早期绑定”的,因此速度更快。你知道你在编译时调用的方法的类型。
使用 DispInterface 是“后期绑定”的,因此速度较慢,但更灵活。它广泛用于脚本编写。方法和属性类型在运行时确定。
我希望这个简短的解释会有所帮助。