COM学习笔记8_IDispatch (调度接口) 自动化

2023-10-29

一般的通讯方式:
客户 <==> COM(vbtl)接口 <==> COM组件

自动化通讯方式:
客户(自动化控制器) <==> IDispatch::Invoke <==> 调度接口(或vbtl接口) <==> 实现IDispatch接口的COM组件 (自动化服务器)

自动化服务器 : COM组件
自动化控制器 :COM客户

相关知识:IDispatch, 调度接口,双重接口,类型库,IDL, VARIANT, BSTR
调度接口(dispinterface) :IDispatch::Invoke的一个实现所能调用的函数集合,客户只能通过IDispatch::Invoke使用组件
COM(vbtl)接口(custome) : 一个指针,指向一个函数指针数组,数组前三个元素是 QueryInterface,AddRef和Release
双重接口(dual) :客户既可以通过调度接口(IDispatch::Invoke),也可以直接通过COM接口(vbtl调用)使用组件

一般C++程序直接使用抽象接口调用COM组件,而编译器会进行地址映射。例如:
pIX->Fx (msg) ;
实际会被编译成这样:
(*(pIX->vbtl [IndexOfFx]))(pIX, msg) ;
具体如下:
1. 获取Fx在虚函数表中的索引 IndexOfFx = 4
2. 获取Fx的函数地址 pAddressOfFx = pIX->vbtl [IndexOfFx]
3. 解引用,调用函数 (注意需要传入this指针) (*pAddressOfFx)(pIX, msg)
上面三步合成就是 (*(pIX->vbtl [IndexOfFx]))(pIX, msg) ;了

但问题在于像VB, Javascript等没有指针的概念,如何做到上面几步,获取vbtl中的函数指针呢?
可以编写一个C++分析器处理 (相当于加入了一个中间层)
中间层关键要处理三种信息 : 组件的ProgID, 函数名称,参数
这个中间层通过IDispatch接口实现,其原型:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

COM学习笔记8_IDispatch (调度接口) 自动化 的相关文章

  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • 服务器端生成的 Excel 中出现 System.Runtime.InteropServices.COMException 错误

    我们有一个 Web 应用程序 可以生成 Excel 电子表格并在服务器端运行宏 然后它通过电子邮件将它们发送给不同的人 它是传统报告风格的一部分 我们正在对其进行转换 但仍然支持我们作为 IIS 中的网站提供的新应用程序 我知道进行 Off
  • SQL - 用 varchar 替换 is null 整数

    我正在尝试用新的列替换列varchar如果 select 语句中存在空值 则为字符串 personid ISNULL personid no person 我不想更新它 只是在查询结果中将值显示为 无人 但我收到一条错误消息 将 varch
  • 界面与组合

    我想我理解接口和抽象之间的区别 抽象设置默认行为 在纯抽象的情况下 行为需要由派生类设置 接口是您所需要的 无需基类的开销 那么接口相对于组合的优势是什么 我能想到的唯一优点是在基类中使用受保护的字段 我缺少什么 你的标题没有意义 你的解释
  • 将国际象棋引擎连接到用 Javascript 制作的现有 GUI

    我编写了自己的用于下棋和教授国际象棋的 GUI GUI 是使用 HTML 编写的 用于外观 使用 JavaScript 来实现各个部件的行为 目前该程序不遵循任何国际象棋规则 正确遵循国际象棋规则取决于用户 这允许自由地设置非法位置或多次移
  • 继承接口方法的重新实现

    我不完全理解如何使用接口 所以我必须问 我使用 BaseClass 它实现了 IBaseClass 接口 这些接口仅包含一个声明 public interface IBaseClass void Refresh 所以我在我的 Basecla
  • C# - 挂钩现有 COM 对象

    假设我们有一个现有进程 或应用程序 它从 ocx 文件 例如 MyCOMLibrary ocx 调用 COM 对象 有没有办法编写一个 C 库来精确复制 ocx 文件 这样原始应用程序就可以调用您的 C 代码而不是原始 COM 对象 当然
  • C 结构体信息隐藏(不透明指针)

    我目前对 C 结构信息隐藏的概念有点困惑 这道题的背景是一个嵌入式c项目 对OOP的了解几乎为零 到目前为止 我总是在相应模块的头文件中声明我的 typedef 结构 因此每个想要使用该结构的模块都知道该结构类型 但经过 MISRA C 检
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 让按钮更容易点击

    我有一个按钮 在某些手机上由于尺寸太大而很难点击 但让它变大会破坏布局 可以向视图解释它有一个比其可见区域更大的 点击框 吗 不确定这是否有帮助 如果您使用没有背景的 ImageButton 并设置 Padding 值 您的按钮将具有更大的
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • Android proguard Javascript 接口问题

    我的项目在使用 proguard 进行混淆后因 javascriptinterface 失败 这是包含混淆器配置的一些建议的链接 但它在我的情况下不起作用 http groups google com group android devel
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • .NET 组件和 COM 组件有什么区别

    NET 组件和 COM 组件之间有什么区别 有时我们使用 NET 组件包含在我们的项目中 有时我们包含 COM 引用 背后的想法是什么 NET 组件是托管代码 内存处理已为您完成 COM http en wikipedia org wiki
  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • 我应该选择哪个 VC++ 运行时版本 - 静态还是动态?

    我正在开发一个 64 位进程内 VC ATL COM 服务器 它基本上只是将所有调用重定向到进程外 COM 服务器 所以我的COM服务器基本上什么都不做 最初它在 DLL 中使用 C 运行时 MD编译器开关 我注意到当我在干净的 64 位
  • 使用 pythoncom 在 Python 进程之间编组 COM 对象

    我希望有人可以帮助我从 Python 进行编组跨进程调用到 Excel 我有一个通过 Python 启动的 Excel 会话 我知道当需要从单独的 Python 进程访问它时 该会话将会启动并运行 我已经使用编组让一切按预期工作CoMars
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • C 中使用指针的结构冒泡排序

    我想使用 C 中的冒泡排序算法和指针对结构数组进行排序 我有一个汽车结构 typedef struct char model 30 int hp int price cars 我为 12 个项目分配内存 cars pointer cars

随机推荐

  • 【Linux】网络设置之基础操作命令详解

    大家好 本篇文章主要讲的是Linux网络设置之基础操作命令详解 感兴趣的同学快来看一看吧 对你有用的话记得收藏起来 方便下次浏览 查看网络配置 查看网络接口信息 ifconfig 查看活动的网络接口设备 1 ifconfig 网卡名称 查看
  • 深度学习之前馈神经网络的入门学习(我觉得是全网最详细的)

    前馈神经网络 Feedforward Neural Network 是一种最基本的人工神经网络模型 它也被称为多层感知器 Multilayer Perceptron MLP 在前馈神经网络中 信息只能在输入层向前传递到输出层 不存在反馈连接
  • PG 数据库锁表问题

    转载文章 若有侵权还请联系 PG 数据库锁表问题解决方案 查询pg数据库锁表的语句和进程 通过进程pid杀掉进程进行批量表解锁 pg锁表解决办法 Fly L的博客 CSDN博客 查询锁表语句和 pid select pid query fr
  • p5js创意自画像

    实验要求 编程语言与工具 编程可以用p5 processing 若想用其他语言或工具 提前向老师说明情况 作品 一件编程创意作品 必须实现动态效果或交互效果 作品录制一段一分钟内的视频 作品可以是具象化地描绘自己的形象 也可以是任何形式表现
  • 2018人工智能应用例子_汇总贴

    大数据分析 e20180621 大数据统计分析 国家审计局 老鼠仓 利用职务便利 操作证券基金 转载于 https www cnblogs com 2010dream p 9218773 html
  • antlr4 Verilog2001.g4

    verilog which antlr4 antlr4 aliased to java Xmx500M cp usr local lib antlr 4 9 complete jar CLASSPATH org antlr v4 Tool
  • 子shell的理解

    创建子shell 在当前shell 使用bash 命令即可创建子shell程序 在子shell上还可以继续创建子shell 例子 使用命令 ps f 查看进程信息 程序运行后就是进程 它可以反应程序运行的状态信息 user1 localho
  • k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1beta1.Ingress: failed to l

    原因 kubectl version v1 22 不再支持v1beta1 所以要解决这个问题需要把ingress nginx 换成最新的版本 1 0 0
  • Android10填坑适配指南,实际经验代码,持续补充

    Android10填坑适配指南 包含实际经验代码 绝不照搬翻译文档 1 Region Op相关异常 java lang IllegalArgumentException Invalid Region Op only INTERSECT an
  • HCIP datacom 821、831题库

    全部黄色底纹为错误题 绿色 全部绿色字体为正确题 关于OSPF缺省路由描述错误的是 由于OSPF路由的分级管理 Type5 7缺省路由的优先级高于Type3路由 OSPF的Router LSA中 如果其Link Type为1 则该LSA描述
  • 几行命令完成docker多网站的部署(wordpress和dedecms)

    建设目标 利用docker技术快速搭建wordpress和dedecms 完成多域名的部署工作 操作时间评估 20分钟 主要部署内容 php7 nginx myssql wordpress dedecms 主要操作过程 几个命令行 安装环境
  • IDEA学习JDBC编程连接MySQL

    IDEA连接数据库可以有两种方式 1 通过Database建立连接 连接成功后可以直接操作数据库 需要注意的是MySQL 8 版本的Driver与之前的有所不同 com mysql cj jdbc Driver 还有一点就是时区问题 全球标
  • 爽啊爽啊爽

    致五个月的兄弟连兄弟姐妹 我们来兄弟连干什么 写程序写程序 写程序 上课的时候干什么 写程序写程序 写程序 下课的时候干什么 写程序写程序 写程序 宿舍的时候干什么 写程序写程序 写程序 开心的时候干什么 写程序写程序 写程序 伤心的时候干
  • URP教务系统自动登录

    文章目录 验证码 获取验证码图片 识别验证码内容 图片降噪处理 自动登录 爬取需要的数据 这篇博客是我对 hack 进学校教务系统的一个过程总结 详细代码已经放在GitHub上 需要的自取 URP教务系统自动登录脚本 验证码 打开网站 ht
  • 内存管理408

    文章目录 一 内存管理概念 1 内存管理概念 1 1 内存管理的基本原理与要求 1 2 逻辑地址与物理地址 1 3 进程的内存映像 1 4 内存保护 1 5 内存共享 2 覆盖与交换 2 1 覆盖 2 2 交换 3 连续分配管理方式 3 1
  • 解决vue-router-active无效问题

    设置的样式中 path为 的icon始终被设置了active样式 解决办法 由于router link to的每个路由首部都存在 因此都可以激活默认路由 这也是为什么当path为 的时候始终有active样式 甚至出现了当点击其他tab按键
  • vue+element-ui+vuex实现 面包屑 + Tag多标签切换功能

    参考网址 https www cnblogs com qdhxhz p 12590324 html 建议 亲测可用 把上一篇文章一起看 从左侧菜单栏看起就不会乱了
  • java居然也能实现简单斗地主功能

    出于无聊 就想着斗地主能否通过java程序来写 后面思考了下确实可以实现 目前只实现了发牌的功能 出牌和智能出牌的代码尚未写 有兴趣的朋友可以和我一起试试看 具体代码还比较简单 具体代码如下 package com xinwei oms i
  • 2023华为OD机试真题-单词倒序(JAVA、Python、C++)

    题目描述 输入单行英文句子 里面包含英文字母 空格以及 三种标点符号 请将句子内每个单词进行倒序 并输出倒序后的语句 输入描述 输入字符串S S的长度1 N 100 输出描述 输出逆序后的字符串 补充说明 标点符号左右的空格 0 单词间空格
  • COM学习笔记8_IDispatch (调度接口) 自动化

    一般的通讯方式 客户 lt gt COM vbtl 接口 lt gt COM组件 自动化通讯方式 客户 自动化控制器 lt gt IDispatch Invoke lt gt 调度接口 或vbtl接口 lt gt 实现IDispatch接口