在导致意外行为的对话框上两次添加相同的 ActiveX 控件

Posted

技术标签:

【中文标题】在导致意外行为的对话框上两次添加相同的 ActiveX 控件【英文标题】:Adding Same ActiveX control twice on a dialog causing unexpected behaviour 【发布时间】:2015-09-29 07:34:13 【问题描述】:

我开发了一个 MFC ActiveX 控件,该控件使用使用 OPC 客户端从 Kepware OPC Server 检索到的数据显示图形。 OPC 客户端代码是 ActiveX 控制代码的一部分。 OPC 客户端在与主控制线程不同的线程中启动。当 MFC 对话框中只有一个控件实例时,该控件运行良好。但是,如果我在同一表格上添加它的另一个实例,则图表上的曲线开始出现故障。从日志中我可以看到最终从 CWinApp 派生的 Control 应用程序类仅实例化一次。任何想法为什么它搞砸了?两个实例之间是否共享任何全局变量?我正在使用 Visual Studio 2008。

【问题讨论】:

【参考方案1】:

如果您的 ActiveX 控件位于 DLL 中,则该 DLL 总是会在使用 ActiveX 控件的进程中加载​​一次。所以即使你有多个控件,你也只有一个 CWinApp 对象是正常的。

因此,您需要以某种方式设计您的对象,即 DLL 中的全局数据不会影响控件实例中的行为或数据。

我假设您有一些全局数据,供第一个控件使用。当另一个实例被创建时,这个全局数据被第二个实例修改,第一个实例显示错误的数据或行为不端。

此类 ActiveX 的所有状态都必须在对象内部定位和分配。

【讨论】:

我解决了这个问题,我发现我正在使用静态变量来实现单例。这由两个实例共享,从而导致故障。实例之间是否共享静态变量? 是的!静态变量是进程内 DLL 存储的一部分。因此,对于控件的每个实例,您都可以访问相同的数据。

以上是关于在导致意外行为的对话框上两次添加相同的 ActiveX 控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencart的同一页面上两次使用相同脚本中的脚本?

意外的分叉行为

Struts2+DAO层实现实例03——添加监听器跟踪用户行为

iPhone 上 iOS Safari 中的过渡会导致意外行为

从目标视图更新 SwiftUI 列表数据会导致意外行为

如果重载和覆盖相同的方法,Java中的意外多态行为