COM双接口

时间:2010-05-14 17:42:15

标签: interface com idispatch

COM中的双接口是可以通过DispInterface或VTable方法访问的接口。

现在有人可以告诉我这两种方法的区别究竟是什么?

我认为VTable是一个虚拟表,它在实现具有可在子类中重写的虚函数的类层次结构时保存指向不同函数的指针。但是我不知道这与COM中的双接口有什么关系?

3 个答案:

答案 0 :(得分:3)

主要区别在于调用对象方法。在DispInterface的情况下,调用通过IDispatch :: Invoke方法(在脚本中使用或在没有接口描述的情况下),请参阅remarks。这种方法的第二选择慢得多。在第二种情况下,直接使用VTable进行方法调用(用于来自C ++或.NET语言的调用)

答案 1 :(得分:3)

我只想回答其他Tony的问题。

如果你想创建一个可以从VBScript / JScript或旧的“经典”ASP访问的COM,你必须实现IDispatch。

在Visual Basic 6或MS Office的VBA中,可以使用两种方式。如果您向COM添加引用,那么您将使用“早期绑定”(IUnknown或VTable)。如果您在VB6中使用COM或在CreateObject(“ProgIdName”)中使用VBA,那么您将使用“后期绑定”。

了解要使用VB6 / VBA等可以访问COM非常重要。仅仅实现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内的资源。

答案 2 :(得分:2)

简而言之,COM是二进制规范,而不是语言规范。在接口和代码中派生类之间确实没有相关性。苹果和橘子。

VTable是“早期绑定”,因此速度更快。您知道在编译时调用的方法类型。

使用DispInterface是“后期绑定”,因此速度较慢,但​​更灵活。它广泛用于脚本编写。方法和属性类型在运行时确定。

我希望这个简短的解释有所帮助。