支持 IDispEventImpl - (COM事件的使用) .

Visual C++ COM连接点实战:ATL实现事件通知与观察者模式 在组件对象模型(COM)架构中,实现组件与客户端之间的高效通信是核心挑战之一。其原理基于接口的二进制标准,通过定义明确的契约实现跨进程、跨语言的互操作性。连接点技术作为COM事件机制的关键实现,提供了重要的技术价值,它允许源对象主动向多个客户端广播事件,有效解决了传统轮询模式效率低下的问题,实现了经典的观察者模式。这一机制在桌面应用、中间件和自动化控制等场景中广泛应用,特别是在需要实时数据推送的场景下,如股票行情服务器、设备状态监控等。本文将以Visual C++和ATL框架为基础,深入解析连接点的实现路径 阅读详情

支持 IDispEventImpl

模板类 IDispEventImpl 可用于在 ATL 类中提供连接点接收器支持。连接点接收器使类得以处理从外部 COM 对象引发的事件。这些连接点接收器是用事件接收映射(由类提供)来映射的。

若要正确地实现类的连接点接收器,必须完成以下步骤:

  • 为每个外部对象导入类型库
  • 声明 IDispEventImpl 接口
  • 声明事件接收映射
  • 通知和取消通知连接点

实现连接点接收器所涉及的步骤都是只通过修改类的头文件 (.h) 来完成的。

导入类型库

对于每一个希望处理其事件的外部对象,都必须导入类型库。此步骤定义可以处理的事件,并提供在声明事件接收映射时使用的信息。可以使用 #import 指令来完成此任务。在类的头文件 (.h) 中,为每个要支持的调度接口添加必需的 #import 指令行。

下面的示例导入外部 COM 服务器 (MyServer) 的类型库:

#import "D://MyServer.dll" raw_interfaces_only, no_namespace, named_guids
注意   对每个要支持的外部类型库必须有一个单独的 #import 语句。

声明 IDispEventImpl 接口

您已导入了每个调度接口的类型库,现在需要为每个外部调度接口分别声明 IDispEventImpl 接口。修改类的声明,为每个外部对象添加一个 IDispEventImpl 接口声明。有关参数的更多信息,请参见 IDispEventImpl。

下面的代码声明两个连接点接收器,一个用于自定义 IExtEvents1 和 IExtEvents2 接口,一个用于 CMyObj 类实现的 COM 对象:

public IDispEventImpl<0, CMyObj, &DIID__IExtEvents1,
    &LIBID_EXTEVENTS1Lib, 1, 0>,
public IDispEventImpl<1, CMyObj, &DIID__IExtEvents2,
    &LIBID_EXTEVENTS2Lib, 1, 0>

声明事件接收映射

为使事件通知能够由正确的函数处理,类必须将每个事件路由到它的正确处理程序。这一点通过声明一个事件接收映射来实现。

ATL 提供了若干个使此映射更容易的宏:BEGIN_SINK_MAP、END_SINK_MAP 和 SINK_ENTRY。标准格式如下所示:

BEGIN_SINK_MAP(comClass)
   SINK_ENTRY(id, dispid, func)
   . . . //additional external event entries
END_SINK_MAP()

下面的示例用两个事件处理程序声明一个事件接收映射:

BEGIN_SINK_MAP(CMyObj)
   SINK_ENTRY(0, Events1, OnClick1)
   SINK_ENTRY(0, Events2, OnClick2)
END_SINK_MAP()

实现已接近完成。最后一步涉及通知和取消通知外部接口。

通知和取消通知 IDispEventImpl 接口

最后一步是实现一个在适当的时间通知(或取消通知)所有连接点的方法。必须先完成这种通知,外部客户端与对象之间的通信才能发生。在对象变得可见之前,会向对象支持的每个外部调度接口查询输出接口。建立一个连接,并使用对输出接口的引用来处理来自对象的事件。此过程称为“通知”。

在对象使用完外部接口之后,应通知输出接口它们不再由类使用。此过程称为“取消通知”。

由于 COM 对象的独特特性,此过程的具体细节和执行因实现而异。这些细节超出了本主题的范围,不予讨论。 

掌握ATL双接口编程:实战代码示例 在 COM(Component Object Model)编程中,接口(Interface)是一种定义了对象行为的合约或协议。它提供了一组规则,这些规则确保了 COM 对象的不同实现可以以统一的方式进行交互。接口是 COM 中实现多态性的关键,它们通过虚函数表(vtable)实现,并且使用全局唯一的标识符(GUID)进行标识。在 COM 的接口类型中,最常见的是基本接口、双接口和自定义接口。基本接口(也称为“简单接口”)是最简单的接口形式,由一个或多个方法组成。 阅读详情

相关推荐

Remobjects SDK使用EventSink实现服务器主推数据给客户端

代码示例如何使用Remobjects实现服务器主推数据给客户端。C#实现。

ATL:IDispatchImpl, IDispEventImpl, IDispEventSimpleImpl的区别和联系

这几个类都和IDispatch的实现有关系,但是他们提供的IDispatch的实现是不同的。 IDispatchImpl只能用于双接口(Dual Interface)的实现。IDispatchImpl本身的IDispatch接口实现是使用ITypeInfo::Invoke的。ITypeInfo简单来说是一个代表TypeLibrary中一个类型的COM对象,比如某个interface IA。而IT

张羿的优快云专栏 5870

Android - 蓝牙开发

文章目录科普SIG类型制式编程Classic BluetoothBluetooth Low Energy蓝牙的UUID是什么?有什么用? 科普 https://zh.wikipedia.org/wiki/%E8%97%8D%E7%89%99 蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由 2.4 至 2.485 GHz 的 ISM(工业、科学、医疗)频段来进行通信。1994 年由电信商

qq_43323826的博客 1万+

支持 IDispEventImpl - (COM事件的使用)

支持 IDispEventImpl模板类 IDispEventImpl 可用于在 ATL 类中提供连接点接收器支持。连接点接收器使类得以处理从外部 COM 对象引发的事件。这些连接点接收器是用事件接收映射(由类提供)来映射的。若要正确地实现类的连接点接收器,必须完成以下步骤: 为每个外部对象导入类型库 声明 IDispEventImpl 接口

5618

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3408

S32K3 eMIOS输入捕获(ICU)全解析:从信号测量到代码实现

本文深入解析了S32K3 eMIOS输入捕获(ICU)技术,从信号测量到代码实现的完整流程。详细对比了六种核心捕获模式的性能差异,提供了动态模式切换、Counter Bus配置、中断服务程序优化等实战技巧,并分享了汽车电子中的典型应用案例,如发动机转速测量和CAN唤醒脉冲检测。

weixin_33137081的博客 347

VC浏览器相关的学习(六)(IDispEventImpl包装的主要方法)

IDispEventImpl包装方法对Ajax相当无力,也就是说对Flash也是没辙,娘的又走了弯路,作为几天的总结,IDispEventImpl包装的方法如下:    MyRock.h    IDispEventImpl包装方法对Ajax相当无力,也就是说对Flash也是没辙,娘的又走了弯路,作为几天的总结,IDispEventImpl包装的方法如下: // MyRock.h : Declaration of the CMyRock #pragma once #include "resource

Kana Memo 4270

5G时代必知:LDPC与Polar码实战解析(附MATLAB仿真代码)

本文深入解析5G时代核心信道编码技术LDPC码与Polar码的原理差异及性能表现,通过MATLAB仿真代码展示其在实际通信系统中的应用。LDPC码适用于大数据块高速传输,而Polar码在小数据块低时延场景表现优异,帮助开发者优化5G系统设计。

sugar的博客 642

IDispEventSimpleImpl和IDispEventImpl应用分析

ATL所自带响应Event的类有两个 IDispEventSimpleImpl IDispEventImpl 它们的区别是一个是否带类型库,现在看看他们的模板参数 [cpp] view plaincopy template UINT nID, class T, const IID* pdiid>  class ATL_NO_VTABLE IDispEventSimpleI

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1497

PyFluent进阶实战:自动化密闭几何(Watertight)网格生成

本文深入探讨了如何利用PyFluent实现自动化密闭几何(Watertight)网格生成。通过Python脚本控制Fluent Meshing工作流,工程师可以高效、一致地完成从几何导入、局部尺寸定义、面网格生成到边界层设置和体网格输出的全过程,从而将复杂的CFD前处理工作转化为可重复、可集成的自动化流程,极大提升仿真效率和知识复用性。

t8u9v0w1x的博客 578

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1350

BHO开发中的IE事件响应原理

转自:http://blog.csdn.net/lyclowlevel/article/details/5955065 PS:本文适合于对虚表、模板等语法特性熟悉的朋友。 ATL的IDispEventImpl简化了事件响应的编码流程。一般需要3个步骤: 1、  继承IDispEventImpl: public IDispEventImpl   2、  添加SINK_ENTRY

qdujunjie的专栏 2770

【Python爬虫教程】第3篇-解决使用reqeusts遇到的ProxyError异常

Python request代理错误提示“HTTPSConnectionPool, Cannot connect to proxy, no such file or directory”

分享技术,记录思考和感悟 1508

VC++实现COM事件接收器

1、给程序添加ATL支持。   右键->New ATL Object   2、实现IDispEventImpl 接口。   //EventSink.h#import "..\Server\Debug\Server.exe" raw_interface_only,no_namespace,named_guidsclass CEventSink :public IDispEventIm...

weixin_30340353的博客 378

SAP-MM-供应商对账平台(功能集合)

(1)集成OA审批,线上核销,结果写入SAP; (2)集成SRM,线上与供应商对账确认,写入SAP; (3)集成财务付款结果确认写入,OA回传结果,定时同步SRM供应商平台。 欢迎留言交流,功能完善,如需要页面设计,请订阅专栏

qq_32198063的博客 748

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

COM的通信原理及ATL的通信操作 看过的一篇非常好的讲解通讯机制的文章

COM的通信原理及ATL的通信操作 一、             COM的通信原理 1、  通信模型:一般,我们只使用客户端程序到组件的通信,并且这种通信是通过组件的接口来实现的。现在,我们讲一下服务器到客户端之间如何打开一个双向通信通道,并提供一个功能更加强大的通信环境。按下面的方法可以提供一个具备回调功能(或称通知)的组件: a)         在一个组件中描述几个

pirate97的专栏 3873

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

在 VC++ 6.0 中使用 ATL 实现对 COM 对像的事件处理

如果当前工程不支持 ATL,则先要向工程中添加对 ATL 的支持1> 在调用 ATL 服务之前(通常是在工程的 StdAfx.h 中) 加入下面代码:#include class CExeModule : public CComModule{public: DWORD dwThreadID;};extern CExeModule _Module; // 不要企图去修变这个变量的名称 !#inclu

2111

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

介绍如何使用IDispEventImpl

支持 IDispEventImpl 模板类 IDispEventImpl 可用于在 ATL 类中提供连接点接收器支持。连接点接收器使类得以处理从外部 COM 对象引发的事件。这些连接点接收器是用事件接收映射(由类提供)来映射的。 若要正确地实现类的连接点接收器,必须完成以下步骤:  为每个外部对象导入类型库  声明 IDispEventImpl 接口  声明事件接收映射

物知馆 1114

(转)ATL:IDispatchImpl, IDispEventImpl, IDispEventSimpleImpl的区别和联系

这几个类都和IDispatch的实现有关系,但是他们提供的IDispatch的实现是不同的。 IDispatchImpl只能用于双接口(Dual Interface)的实现。IDispatchImpl本身的IDispatch接口实现是使用ITypeInfo::Invoke的。ITypeInfo简单来说是一个代表TypeLibrary中一个类型的COM对象,比如某个interface IA。而

gxj1680的专栏 1125

体会COM连接点与实现接收器!

1.COM为了达到通信的双向性(可连接COM对象),即客户端可以调用服务器的功能,在必要的时候服务器也可以调用客户端的接收器功能。2.如果COM要支持事件出口,是可连接的,那么必须实现IConnectionPointContainer接口,通过他接口的 FindConnectionPoint获取支持的指定事件接口的连接点指针(IConnectionPoint)。然后通过获取的IConnecti

jasonM2008的专栏 2776

实现COM消息广播

导读:   实现COM消息广播      大家都知道,为ActiveX控件添加事件处理函数是件容易的事情,IDE已经提供相应的Wizard,为ActiveX控件添加事件处理函数和为一般控件添加事件处理函数没有什么两样。而为普通COM组件添加事件处理函数,就没有这么直观了,必须手工编写相关代码。      如果完全手工去编写这些代码,可以说是相当的麻烦,实际上相当编写另外一个COM组件给原组

yingfox的专栏 512

COM的通信原理及ATL的通信操作

一、 COM的通信原理 1、 通信模型:一般,我们只使用客户端程序到组件的通信,并且这种通信是通过组件的接口来实现的。现在,我们讲一下服务器到客户端之间如何打开一个双向通信通道,并提供一个功能更加强大的通信环境。按下面的方法可以提供一个具备回调功能(或称通知)的组件: a) 在一个组件中描述几个接口,其中一部分接口由组件实现(如IMath),一部分接口...

weixin_30741653的博客 550

深入解析ATL编程:Windows COM组件开发核心技术与实战指南

COM(组件对象模型)是Windows平台实现软件组件化与二进制兼容性的核心技术规范,它定义了跨语言、跨进程的对象通信标准。其原理基于接口与引用计数机制,通过GUID唯一标识组件,实现了代码的高度复用与系统集成。这一技术的核心价值在于支撑了Windows生态中海量系统服务、专业软件及运行时库的稳定运行。在实际开发中,处理高性能中间件、系统级插件或维护遗留系统时,COM技术尤为关键。ATL(Active Template Library)作为微软推出的C++模板库,正是为了高效实现COM规范而生,它通过模板元

weixin_30644369的博客 421
上一篇: 新的挑战
下一篇: ATL_NO_VTABLE详解 .
newlist
博客等级 码龄14年 12粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值