• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 为什么要实现双接口

为什么要实现双接口

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了为什么要实现接口,实现runnable接口,实现serializable接口,抽象类可以实现接口吗,实现接口等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 为什么要实现双接口
描述:

实现双接口的好处是?IDispatch接口是为了脚本里可以访问,那么实现了IDispatch接口后,为什么还要实现IUnknown接口?能举个例子么?


解决方案1:

补充一下luohualiushui(落花流水)的观点,
在VB中两种方式都有可能使用
声明为Object类型的变量使用IDispatch接口,
声明为具体的某个类的变量使用虚函数表
例如:
dim a as object
set a = CreateObject("aa.bb") 'VB内部将IDispatch接口指针赋值给变量a
a.func1(param1) '使用IDispatch提供的Invoke函数调用
dim b as aa.bb '声明的时候使用这种类型的前提是通过添加引用方式将类型库导入到VB工程中
set b = a '在这个赋值操作过程当中, VB内部调用QueryInterface函数得到相应额接口指针
b.func1(param1)    '使用虚函数表调用
VB能够使用虚函数完全依赖于类型库(Type Library)
VBScript因为没有对Type Library的支持(由于VBScript是解释执行的所以向VB一样写程序的时候添加引用是不现实的), 所以只采用IDispatch接口提供的方法调用函数.
在这里想要阐述的重要观点是:
通过Type Library的支持, 可以使用虚函数表调用
通过IDispatch的支持, 可以使用IDispatch接口调用方法

解决方案2:

继承自IDispatch的接口就是双重接口。
在ATL向导中,勾选“Custom”接口的,只能继承IUnknown接口。这样的接口,允许通过虚函数表绑定直接调用COM对象,这就要求使用C++这样的强类型语言,以便在编译时就确定要调用的方法和属性。
如果COM组件使用了IDispatch接口,那么,你当然也能使虚函数表绑定。然而,使用双接口你无需在编译时确定要调用的方法和属性就能够调用COM组件的方法。例如,对于COM组件里的getItem()方法,我们可以指明调用IDispatch::Inoke(),在运行时再将getItem名称作为参数传入,这样,就可以在运行时确定要调用的函数。当然,这种机制对于C++语言来说,几乎没什么用途。但是,对于像VBScript之类的脚本语言却是至关重要的,原因是它们是根本不进行类型检测的,所有的变量都只有一种类型:VARIANT。这类语言就只能通过自动化接口IDispatch调用组件对象的函数。
所以,双接口既实现了对VTable绑定的支持,又提供了对晚绑定的支持,使各种语言的COM客户都能够访问你的组件。

解决方案3:

双接口指的是实现了IDISPATCH接口和c++的vtbl接口的接口,实现IDispatch接口正如楼上所言是为了满足多种语言的通讯用的,他提供了一种新的通讯方式,通过他组件可以向其它语言编写的客户程序提供com接口的服务。不过是以损失效率为代价的(调用invoke等函数是需要开销的)。而同时实现vtbl接口可以提供c++客户程序高效的要求。
实现IUnknown接口是必须的。每个组件都需要查询接口和计数控制功能。

解决方案4:

直接调用接口函数的效率高,在可能的情况下应该直接通过接口调用函数
在vb以及一些脚本语言只能通过IDispatch调用
但在vc中两种调用方法都可以


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 为什么要实现双接口

相关文章

  • 2017-06-04 如何重启服务?有什么专门的API吗?谢谢
  • 2017-06-04 从list中如何取到其中的元素?
  • 2017-06-05 请问高手,怎么样得到另一个正在运行的程序的进程ID号,比如得到Explorexe的进程ID号?
  • 2017-06-05 我从网上下载了一个动态链接库,但调用链接库编译链接都可以通过,但每次调用当中的函数却总是失败,大家帮忙看看是怎么回事?
  • 2017-06-05 两个线程间怎么传递参数?
  • 2017-06-05 多個com口打開問題
  • 2017-06-05 VC6创建一个ATL项目,没有找到Com要求的各个接口啊?
  • 2017-06-05 win2000下有一些进程不能被结束,如何编程实现这一点?
  • 2017-06-05 远程线程嵌入DLL的问题,急求解答!谢谢!
  • 2017-06-04 请问如何比较两个VARIANT变量

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 高分求在vc窗体里显示webmail的图片和链接代码或者控件
    • DLL式COM是不是只可以作为进程内服务器?
    • 能否在VC的主程序框架中调用msagent控件呢?(对话框中调用的我会一点)第一次发贴,请高手指教,有分送上哦!
    • 一个动态库连接的问题
    • javascript调用ActiveX接口的问题!
    • win32服务程序怎样调用一个已有的console程序?
    • 无法启动MFCFlashexe怎么办
    • 如何在ATL控件中加入对ActiveX支持?在线等,急)
    • 关于用IShellLink创建快捷方式,path指定为URL的疑问
    • 如何截取一个进程中函数的调用,同时得到它得参数,返回值,我想用我另外的函数进行替换?????

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有