IDispatch的存在是因为有些语言不支持虚函数表vtable,比如vb,asp等
它的主要作用是“接收一个函数的名称并执行它”
然后IDispatch有几个函数:
GetIDsOfNames,取一个函数的名称并返回其调度ID,或称DISPID
Invoke,可以将DISPID作为函数数组指针的索引 IDispatch叫做调度接口。它的作用何在呢?这个世上除了C++还有很多别的语言,比如VB、 VJ、VBScript、JavaScript等等。可以这么说,如果这世上没有这么多乱七八糟的语言,那就不会有IDispatch。:-) 我们知道COM组件是C++类,是靠虚函数表来调用函数的,对于VC来说毫无问题,这本来就是针对C++而设计的,以前VB不行,现在VB也可以用指针了,也可以通过VTable来调用函数了,VJ也可以,但还是有些语言不行,那就是脚本语言,典型的如 VBScript、JavaScript。不行的原因在于它们并不支持指针,连指针都不能用还怎么用多态性啊,还怎么调这些虚函数啊。唉,没办法,也不能置这些脚本语言于不顾吧,现在网页上用的都是这些脚本语言,而分布式应用也是COM组件的一个主要市场,它不得不被这些脚本语言所调用,既然虚函数表的方式行不通,我们只能另寻他法了。时势造英雄,IDispatch应运而生。:-) 调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数,仅此而已。当然实际的过程远比这复杂,仅给一个编号就能让别人知道怎么调用一个函数那不是天方夜潭吗,你总得让别人知道你要调用的函数要带什么参数,参数类型什么以及返回什么东西吧,而要以一种统一的方式来处理这些问题是件很头疼的事。IDispatch接口的主要函数是Invoke,客户程序都调用它,然后Invoke再调用相应的函数,如果看一看MS的类库里实现 Invoke的代码就会惊叹它实现的复杂了,因为你必须考虑各种参数类型的情况,所幸我们不需要自己来做这件事,而且可能永远也没这样的机会. 说白了,IDispatch就是Java/.Net里面的Reflection(反射)

IDispatch*是干什么用的 C++

2012-06-05 09:58bshenqing  分类:C/C++ | 浏览 1178 次
_variant_t((IDispatch*)mpdb, TRUE),顺便解释下这句话的意思?
分享到:

2012-06-05 12:13

知识大富翁,挑战答题赢iPhone!

提问者采纳

IDispatch的存在是因为有些语言不支持虚函数表vtable,比如vb,asp等
它的主要作用是“接收一个函数的名称并执行它”
然后IDispatch有几个函数:
GetIDsOfNames,取一个函数的名称并返回其调度ID,或称DISPID
Invoke,可以将DISPID作为函数数组指针的索引
IDispatch叫做调度接口。它的作用何在呢?这个世上除了C++还有很多别的语言,比如VB、 VJ、VBScript、JavaScript等等。可以这么说,如果这世上没有这么多乱七八糟的语言,那就不会有IDispatch。:-) 我们知道COM组件是C++类,是靠虚函数表来调用函数的,对于VC来说毫无问题,这本来就是针对C++而设计的,以前VB不行,现在VB也可以用指针了,也可以通过VTable来调用函数了,VJ也可以,但还是有些语言不行,那就是脚本语言,典型的如 VBScript、JavaScript。不行的原因在于它们并不支持指针,连指针都不能用还怎么用多态性啊,还怎么调这些虚函数啊。唉,没办法,也不能置这些脚本语言于不顾吧,现在网页上用的都是这些脚本语言,而分布式应用也是COM组件的一个主要市场,它不得不被这些脚本语言所调用,既然虚函数表的方式行不通,我们只能另寻他法了。时势造英雄,IDispatch应运而生。:-) 调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数,仅此而已。当然实际的过程远比这复杂,仅给一个编号就能让别人知道怎么调用一个函数那不是天方夜潭吗,你总得让别人知道你要调用的函数要带什么参数,参数类型什么以及返回什么东西吧,而要以一种统一的方式来处理这些问题是件很头疼的事。IDispatch接口的主要函数是Invoke,客户程序都调用它,然后Invoke再调用相应的函数,如果看一看MS的类库里实现 Invoke的代码就会惊叹它实现的复杂了,因为你必须考虑各种参数类型的情况,所幸我们不需要自己来做这件事,而且可能永远也没这样的机会.
说白了,IDispatch就是Java/.Net里面的Reflection(反射)

C++中IDispatch接口相关推荐

  1. vbs调用c++dll_COM编程攻略(八 动态调用与IDispatch接口)

    上一篇我们实现了一个本地进程服务. Froser:COM编程攻略(七 COM跨进程组件开发实战)​zhuanlan.zhihu.com 这一篇,我们将对这个本地进程服务做一些修改,让它能支持如下VBS ...

  2. C++中的接口(抽象类)

    1.Cpp中的接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现.接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念.如果类中至少有一 ...

  3. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  4. Objective-C 入门(七)协议 protocol(JAVA中的接口)

    Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...

  5. Android中Parcelable接口用法

    --  通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...

  6. Java中的接口命名[关闭]

    本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...

  7. 初步解读Golang中的接口相关编写方法

    初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...

  8. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  9. C# 类中继承接口的属性

    在开发中面对接口编程,有时需要将属性放到接口中,但是在类中又要如何去继承接口的属性呢? 开始的时候,我以为只要继承了接口,就可以将属性拿来用了.代码如下: public interface IA {i ...

最新文章

  1. codeforces round 416 div2补题
  2. java线程池的概念_Java线程池的基本概念以及生命周期
  3. 刘忠范院士:新型研发机构建设成了口号
  4. Wix中注册c#开发的Activex控件
  5. 机器学习实战-PCA算法-26
  6. 【iVX 初级工程师培训教程 10篇文拿证】09 聊天室制作
  7. 【原创】tarjan算法初步(强连通子图缩点)
  8. 如何解决安卓项目在Android Studio无法打开
  9. vs 正则表达式转大写_liunx之通配符amp;正则表达式
  10. Spring Boot基础学习笔记25:RabbitMQ - 发布/订阅工作模式
  11. mysql调优 参数说明
  12. Windows7下caffe-ssd-microsoft下编译
  13. cmd 命令行方式执行 matlab 脚本
  14. pytorch 查看编号_最完整的PyTorch数据科学家指南(2)
  15. Microsoft.mshtml.dll 添加引用及类型选择错误问题解决办法
  16. 尝试加载Crystal Reports 运行时时出错
  17. 获取Android设备的序列号(SN号)
  18. Tilera吴晓东:2013年要做成三百多个核
  19. 星星城堡童装加盟雾非雾
  20. vsCode html文件格式化

热门文章

  1. SpringBoot 基础上传操作
  2. android按钮点击后闪退_Android开发【04-27求助贴】点击button闪退
  3. python实现二叉搜索树_python实现二叉查找树
  4. 计算机删除等级列在哪里,插入与删除Excel表格的单元格、行和列
  5. MySQL 复制 - 性能与扩展性的基石:概述及其原理
  6. springboot+mybatis+thymeleaf项目搭建及前后端交互
  7. android中ScrollView嵌套ListView或GridView显示位置问题
  8. 2017 JMP Discovery Summit China圆满落幕
  9. Linux不得不知道的目录和文件
  10. POI对Excel自定义日期格式的读取