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 (调度接口) 自动化 的相关文章

  • VBA 中 .NET 的 System.Convert 的替代方案

    我正在 Microsoft Access 中编写一个 VBA 函数 以使用 RSA 密钥加密 解密文本数据 目前正在进行以下工作 CreateObject System Security Cryptography RSACryptoServ
  • 使用 VS2012 中的 C++ 中的 ATL 创建 COM

    尝试在 Visual Studio 2012 中使用 ATL 创建简单的 COM 库 我愿意 New ATL Project Welcome to the ATL Project Wizard Next Application Settin
  • PowerShell 中的 COM 接口包装?

    我在 C 中有以下代码 我尝试将其移植到 PowerShell 但我不知道如何移植这个演员 ISkypeEvents Event skype CallStatus CallStatusHandler 如果我只是在 PowerShell 控制
  • Java:接口可以包含其中定义的常量变量吗?

    我可以创建吗public static final接口中的变量 我可以保留这些文件中定义的一些常见常量值吗 是的你可以 public interface Constants public static final int ZERO 0 然而
  • 如何从 Powershell 访问 COM 对象上的索引属性

    我正在使用 Powershell 通过 COM 与 Windows 7 任务计划程序服务进行通信任务调度2 0接口 http msdn microsoft com en us library aa383600 VS 85 aspx 例如 I
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 删除指针后将其设为 NULL 是一个好习惯吗?

    我首先要说的是 使用智能指针 您将永远不必担心这个问题 下面的代码有什么问题 Foo p new Foo use p delete p p NULL 这是由答案和评论 https stackoverflow com questions 19
  • 查询外键列可以为NULL的地方

    我想获取数据 如果orgid 2或者如果根本没有行uid orgid is an integer 我能想到的最接近的事情就是做IS NULL但我没有得到数据uid没有一个orgid排 任何想法 select u uid u fname u
  • C# 继承

    假设我有以下代码 interface ISomeInterface void DoSomething void A void B public abstract class ASomeAbstractImpl ISomeInterface
  • 释放c循环中的子字符串

    我正在尝试为结构体的每个成员获取一个子字符串 structs 然后将该子字符串分配给temp struct 我遇到的问题是如何在每次迭代时释放子字符串 但是由于某种原因代码运行valgrind抛出一个Invalid read of size
  • 如何将一个接口方法的返回类型定义为另一个接口?

    我对接口和抽象类很陌生 我想创建几个接口来定义购物车系统对象的核心方法和变量 然后我想创建实现核心功能的抽象类 这个想法是 其他类可以以稍微不同的方式针对不同的项目使用它们 这是我的 精简的 界面 public interface ICar
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • 确定数组的大小(如果传递给函数)

    如果将数组传递给另一个函数 未传递大小 是否可以确定数组的大小 数组的初始化类似于 int array XXX 我知道不可能执行 sizeof 因为它会返回指针的大小 我问的原因是因为我需要在传递数组的另一个函数内运行 for 循环 我尝试
  • 如何在 NHibernate 命名查询参数上设置 C# 可为空值类型值?

    我正在使用 NHibernate 并通过命名查询调用存储过程
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • C# 可空相等运算,为什么 null <= null 解析为 false? [复制]

    这个问题在这里已经有答案了 为什么在 NET中会这样 null gt null 解析为 false 但是 null null 解析为真 换句话说 为什么不null gt null相当于null gt null null null 有谁有官方
  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 我需要从 64 位 exe 访问 32 位 dll

    我知道我阅读了有关代理进程的所有内容 并且我能够创建代理 COM 但它要么全部在 32 位中工作 要么全部在 64 位中工作 正确的结构是什么 1 32 dll 我尝试了以上两种方法 但没有成功调用32 dll 我不太了解您所指的代理 CO
  • Avro ENUM 字段

    我正在尝试在 Avro 模式中创建 Union 字段并用它发送相应的 JSON 消息 但要拥有其中一个字段 null https avro apache org docs 1 8 2 spec html Unions https avro

随机推荐

  • 【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接口