- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我添加了一个新接口(interface) IAEx,它是从现有接口(interface) IA(派生自 IDispatch)扩展而来的。
idl 有哪些变化?我已经更改了 coclass 定义以从新定义继承。我更改了 idl 中的 coclass 条目,之前是这样的。
(我需要默认界面作为新界面)
coclass CAx
{
[default] interface IA
[default, source] dispinterface IAEvents;
};
并改为
coclass CAx
{
[default] interface IAEx
[default, source] dispinterface IAEvents;
};
我可以更改默认界面吗?
coclass 定义更改。旧的
class ATL_NO_VTABLE CAx:
...
public CCIDispatchImpl<IA, &IID_IA, &LIBID_CCALib>,
新的。
class ATL_NO_VTABLE CAx:
...
public CCIDispatchImpl<IAEx, &IID_IAEx, &LIBID_CCALib>,
这样好吗?
COM MAP条目修改:旧的:
COM_INTERFACE_ENTRY(IA)
COM_INTERFACE_ENTRY2(IDispatch,IA)
新的:
COM_INTERFACE_ENTRY(IAEx)
COM_INTERFACE_ENTRY2(IDispatch,IAEx)
我是否也需要在 COM MAP 中添加旧接口(interface)?
最佳答案
不,这是对客户端程序的彻底改变。要记住的黄金法则 #1 是 names 在 COM 中非常不重要,只有 uuids 重要。规则 #2 是 COM 组件具有机器作用域,修改组件会影响机器上使用该组件的 每个 程序。另一种说法是 COM 存在严重的 DLL hell 问题。
因此,当您在机器上安装您的组件时,首先会发生的事情是每个使用它的程序都将停止工作。他们仍在寻找“IA”接口(interface) uuid,但它已不存在了。它们因 E_NOINTERFACE 而失败。避免这种情况的唯一方法是使用新类型库重新编译客户端程序,并在部署更新的 COM 组件的同时部署它们。这通常很难安排,因为他们没有共同的程序员或公司。通常只有用户可以执行此操作,他们很少知道如何正确执行此操作或知道如何排除故障。
如果您希望您的更新向后兼容,那么您必须向您的组件类添加一个新接口(interface)。它不能是 [default] 接口(interface),因为现有的客户端程序希望将旧接口(interface)作为默认接口(interface)。然而,这会导致一个新问题,使用 IDispatch 的客户端运行时通常只支持一个默认接口(interface)。通常是因为他们没有将接口(interface)作为主要语言结构的概念。换句话说,您的客户端程序员无法调用 IUnknown::QueryInterface(),因此根本无法使用您的新接口(interface)。所以不是通用的解决方案。
在 COM 中违反接口(interface)是不可变的规则在技术上是可能的。您可以将新方法添加到 IDispatch 接口(interface)的末尾。现有的客户端代码不知道它们,因此永远不会调用它们并继续正确运行组件的旧版本和新版本。假设您知道如何在不引起破坏性行为变化的情况下维护遗留方法,通常比看起来更难。但是仍然存在 DLL hell 问题,当客户端代码的更新版本遇到组件的旧版本时,世界就会崩溃。乍一看这似乎不太可能,但在更换机器或重新镜像时,这往往会在很久以后出错。非常丑陋的场景,无法诊断运行时故障,并且最初涉及的任何人都不在身边或不记得细节。
唯一真正安全的方法是创建一个新版本。修改所有 uuid(LIBID、CLSID 和 IID)并更改 DLL 文件名。现在新旧版本可以共存,客户程序员可以随意使用你的新版本。可能仍然存在部署问题,但故障很容易诊断,客户端程序失败并显示“类未注册”。
关于c++ - C++ COM(ATL)中添加新接口(interface)需要注意什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607353/
我正在运行PHP脚本,并继续收到如下错误: 注意:未定义的变量:第10行的C:\ wamp \ www \ mypath \ index.php中的my_variable_name 注意
我正在运行PHP脚本,并继续收到如下错误: 注意:未定义的变量:第10行的C:\ wamp \ www \ mypath \ index.php中的my_variable_name 注意
我正在运行PHP脚本,并继续收到如下错误: 注意:未定义的变量:第10行的C:\ wamp \ www \ mypath \ index.php中的my_variable_name 注意
我正在运行一个PHP脚本,并且继续收到如下错误:。第10行和第11行如下所示:。这些错误消息的含义是什么?。为什么他们突然出现了?我多年来一直使用这个脚本,从来没有遇到过任何问题。。我该怎么修理它们呢
当我在 flutter clean 之后运行 flutter run 或 debug my code 时显示此错误 Note: C:\src\flutter.pub-cache\hosted\pub.
My Goal: To fix this error and be able to run my app without an error. Error Message: Note:D:\Learni
前言:今天在解决一个问题时,程序总是不能输出正确值,分析逻辑思路没问题后,发现原来是由于函数传递导致了这个情况。 LeetCode 113 问题:给你二叉树的根节点
我正在 R 中开发一个包,当我运行时 devtools::check()我收到以下说明。 checking DESCRIPTION meta-information ... NOTE Malforme
获得通知和警告波纹管 Notice: Use of undefined constant GLOB_BRACE - assumed 'GLOB_BRACE' in /var/www/html/open
我正在准备一个 R 包以提交给 CRAN。 R CMD 检查给了我以下注意: Foreign function calls to a different package: .Fortran("cinc
我正在尝试从以下位置获取数据: http://api.convoytrucking.net/api.php?api_key=public&show=player&player_name=Mick_Gi
我有这段代码,但我不明白为什么我仍然有这个错误,我已经尝试了所有解决方案,但无法解决这个问题:-注意:未定义索引:product_price-注意:未定义索引:product_quantity-注意:
This question already has answers here: “Notice: Undefined variable”, “Notice: Undefined index”, and
我正在尝试从以下位置获取数据: http://api.convoytrucking.net/api.php?api_key=public&show=player&player_name=Mick_Gi
切记,在PHP 7中不要做的10件事 1. 不要使用 mysql_ 函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数。PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移
前几天安装了dedecms系统,当在后台安全退出的时候,后台出现空白,先前只分析其他功能去了,也没太注意安全,看了一下安全退出的代码,是这样写的: 复制代码 代码如下: function ex
我使用此代码来检查变量$n0、$n1、$n2是否未定义。 但每次未定义时我都会收到通知。我的代码是一种不好的做法吗?还有什么替代方案吗?或者只是删除通知,代码就可以了? if
编写代码时处理所有警告是否重要?在我公司中具有较高资历的开发人员坚持认为警告是无害的。诚然,其中一些是: Warning: Division by zero Notice: Undefined ind
我有一个搜索查询,执行搜索查询后,我将$ result放入数组中。 我的PHP代码- $contents = $client->search($params); // executing the se
This question already has answers here: “Notice: Undefined variable”, “Notice: Undefined index”, and
我是一名优秀的程序员,十分优秀!