COM接口规则的存在是有原因的

news2024/10/7 10:16:18

可能有些人认为接口上的 COM 接口规则没有必要设计的那么严格,但我想说的是,这些规则的存在是有原因的。

假设你在你的产品代码中新增加了版本号为 N 的接口,由于这个接口是内部使用的,没有任何公开文档。所以你可以随意修改它,而不会打破任何不兼容性。

但是需要注意的是,如果你修改一个接口,则必须要生成一个新的接口标识符(IID),因为一个接口标识符唯一标识了这个接口(正如它的名字所暗示的那样)。

以上这条规则,即使是对于内部接口也是一样。

假设你决定不遵循这一规则,在 N + 1 版本的接口中继续使用 N 版本相同的 IID,由于这是一个内部使用的借口,应该不会造成什么大影响。

直到你需要为这两个版本编写一个补丁,事情就不太妙了。

这个补丁会出现这样的问题:它可以调用 IUnknown::QueryInterface 方法并传入这个 IID,COM 库会返回一些东西。但是你不会知道返回的是 N 版本的接口,还是 N + 1 版本的接口。如果你没有意识到这一点,则你的补丁代码很可能会假设返回的是 N + 1 版本的接口,这个时候,如果实际的接口是 N 版本的话,一些奇怪的事情就会发生。

调试这类问题不太好玩,相信我,修复它也不太容易。

你的补丁必须使用其他一些提示来决定它实际返回的接口。如果程序以前已打过补丁,则需要具有每个补丁的版本号,以便确定所拥有的接口版本。
请注意,此依赖项可以隐藏在其他接口后面。考虑下面的代码:

>> 请移步至 topomel.com 以查看图片 <<

假设你要向 IColorInfo 接口添加一个新方法:

>> 请移步至 topomel.com 以查看图片 <<

由于改变了接口,但同时也改变了IID,所以一切都很好,对吧?
非也!

IGraphicImage 接口依赖于 IColorInfo 接口。当你修改 IColorInfo 接口时,也隐式更改了
IGraphicImage::GetColorInfo 方法,因为返回的接口现在是 N + 1 版本的 IColorInfo 接口。

考虑使用 N + 1 版本的头文件编写的补丁程序。

>> 请移步至 topomel.com 以查看图片 <<

如果针对 N 版本运行,则对
IGraphicImage::GetColorCount 的调用将返回 N 版本的 IColorInfo,并且该版本不支持 IColorInfo::AdjustColor 方法。但无论如何你调用它。结果就是: 访问 N 版本的虚函数表的结尾并造成访问违规。

快速的解决方案是,修改 IGraphicImage 的 IID,以反映它所依赖的 IColorInfo 接口上的更改。

>> 请移步至 topomel.com 以查看图片 <<

更可靠的解决方法是,修改
IGraphicImage::GetColorInfo 方法,以便传递要接收的接口。

>> 请移步至 topomel.com 以查看图片 <<

这允许更改 IGraphicImage 所依赖的接口,而无需更改 IGraphicImage 接口本身。当然,实现需要改变以响应IID_IColorInfo 的新值。但是现在调用者可以放心,因为当它请求接口时,它实际上是在获取它,而不是巧合地具有相同名称的其他东西。

总结

我从过去伤痕累累的经历中只学会了一件事: 接口一经对外发布,就只能扩展,不能再修改。你得为你的客户想想。
成也 COM,败也 COM。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The COM interface contract rules exist for a reason》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel 热点参数限流

何为热点&#xff1f;热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据&#xff0c;并对其访问进行限制。比如&#xff1a; 商品 ID 为参数&#xff0c;统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数&#xff0c;针对一段时间…

Prompt工程师指南[资料整合篇]:Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等,超全面资料

Prompt工程师指南[资料整合篇]&#xff1a;Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等&#xff0c;超全面资料 1.论文合集 The following are the latest papers (sorted by release date) on prompt engineering. We update this on a daily bas…

Ozeki VOIP SIP SDK 10.3.199 Crack

Ozeki VOIP SIP SDK 使用Ozeki VoIP SIP SDK&#xff0c;您有机会制作自己的VoIP产品&#xff0c;例如软电话&#xff0c;甚至您自己的PBX。 Ozeki VoIP SIP SDK介绍 Ozeki VoIP SIP SDK 是一个软件开发工具包&#xff0c;允许您使用 SIP 协议进行 VoIP 呼叫。它可以很容易地…

LNMP平台对接redis服务

LNMP见我2023-04-17 10:51:16 发布的企业网站架构部署与优化 LNMP https://blog.csdn.net/Richard_Sniper/article/details/130158518?spm1001.2014.3001.5501 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网&#xff1a;http://redis.io/ 下载包&am…

解读直接RF采样架构及优势

多年来&#xff0c;数字收发机被应用在多种类型的应用中&#xff0c;包括地面蜂窝网络、卫星通信和基于雷达的监视、地球观测和监控。过去&#xff0c;收发机的系统工程师在这些应用中使用中频架构。现在&#xff0c;高速数据转换器的最新发展&#xff0c;使新型基于射频直接采…

gif怎么转换成mp4格式?

gif怎么转换成mp4格式&#xff1f;GIF动态图片是一种常见的图片文件&#xff0c;平时我们聊天时会使用到表情包、广告宣传场景也会使用到gif动图&#xff0c;而MP4则是目前广泛应用的视频格式&#xff0c;相信大家都知道这一点。将GIF图片转换为视频格式是一种非常实用的方法。…

SpringCloud实用篇02

文章目录 SpringCloud实用篇020.学习目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09…

选择无论文答辩硕士,那只能选择免联考双证中国人民大学与加拿大女王大学金融硕士

硕士的论文和答辩是一种检验硕士阶段的学习研究成果的一种方式&#xff0c;通过答辩可以让老师清楚的了解论文的价值所在。但从选题背景、研究意义到研究思路、理论基础、研究方法再到关键技术点、实践难点等等&#xff0c;这一个复杂的过程让很多考生在最后这一关被淘汰出局。…

咚咚咚,穷人版生产力工具,好用到飞起

每个程序员都有自己的生产力工具&#xff0c;不管你是深耕职场多年的老鸟&#xff0c;还是在学校努力学习的小鸟&#xff0c;应该都有自己囊里私藏的好辅助。比如帮你完成从头脑风暴草图到创建线框图/原型的UI工具&#xff0c;让代码规范和交付更为可靠的版本控制工具等等。 今…

23种设计模式的必备结构图

这里总结了23种设计模式的结构图及定义&#xff0c;样例代码在 Github&#xff1a;studeyang/design-pattern。 一、创建型模式 1.1 简单工厂模式 1.2 工厂方法模式 工厂方法模式&#xff0c;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一…

metaRTC6.0 janus推流操作指南

概要 Janus 是一个非常有名的 WebRTC 流媒体服务器&#xff0c;它是以 Linux 风格编写的服务程序&#xff0c;采用 C 语言实现,Janus 提供插件机制来支持不同的业务逻辑&#xff0c;配合官方自带插件就可以用来实现高效的webRTC Server服务。 metaRTC6.0新版本支持向janus推流…

【国内某组态软件和plc的通信漏洞挖掘】

因为已从原单位离职&#xff0c;复现的环境也已经丢失&#xff0c;再加上也没怎么提交过漏洞&#xff0c;导致上传cnvd失败&#xff0c;故发在此处&#xff0c;万一有用的话&#xff0c;有缘人可自行提交漏洞库。 &#xff08;一&#xff09; 环境 组态软件IP地址&#xff1a…

freemark模板导出word-01-简单文本内容

在一些项目中&#xff0c;会遇到导出固定格式的word文档&#xff0c;这个时候我们可以使用模板freemarker来实现&#xff0c;本文先分享简单的字符串填充。 比如现在有一个word模板的样式如下 我们填充好内容后(重点坑点&#xff1a;先采用记事本类似的将${A1}编辑好&#xff…

简易画笔效果

使用代码创建纯白图片&#xff0c;图片大小要与image组件大小相同 使用OnDrag触摸的时候将触摸点周围的像素都改为透明 使用shader判断两张图&#xff0c;只要有一张图像素点透明的地方就都透明 shader代码 Shader "Hidden/Draw" {Properties{_MainTex ("Textu…

少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(判断题)2023年3月

2023年3月scratch编程等级考试二级真题 判断题(共10题,每题2分,共20分) 26、执行完这段程序后,可以在舞台上画出一个正方形 答案:错 考点分析:考查积木综合使用,重点考查画笔积木的使用,从程序中可以看出落笔是在最后,所以在落笔之前绘制的图形是不会显示出来,没…

机器学习服务语音合成,解锁智能养娃新趋势

从翻阅图书绘本到捧着电子书&#xff0c;再到点开手机里的音频APP&#xff0c;随着“互联网阅读”的逐步深入&#xff0c;儿童有声读物越来越受95后父母的欢迎&#xff0c;它的出现令年轻父母摆脱了为孩子讲故事的辛苦&#xff0c;而且有声读物配音发音更加标准&#xff0c;有助…

每日学术速递5.15

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Not All Languages Are Created Equal in LLMs: Improving Multilingual Capability by Cross-Lingual-Thought Prompting 标题&#xff1a;并非所有语言在 LLM 中都是平等的&#…

直流电机 PID 控制系统仿真研究(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

openGauss数据库3.0.0升级5.0.0操作实践

文章目录 1.1 前言1.2 升级须知升级流程升级方式升级约束 1.3 升级前准备1.4 升级操作1.5 升级验证1.6 提交升级 1.1 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。之前基于3.0.0版本进行了一些实践&#xff0c;本篇就详细介绍如何将o…

Win7/Win10/Win11系统怎么显示文件后缀

在不同版本的Windows系统中&#xff0c;如Win7/Win10/Win11&#xff0c;显示文件的后缀名可能会有所不同。为了方便用户在进行文件管理时更加方便和高效&#xff0c;本文整理了Win7/Win10/Win11系统中显示文件后缀的具体方法&#xff0c;希望能帮助大家更加轻松地管理自己的文件…