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

C++ 在对话框上添加两次相同的ActiveX控件会导致意外行为,c++,mfc,activex,C++,Mfc,Activex,我开发了一个MFC ActiveX控件,它使用OPC客户端从Kepware OPC服务器检索的数据显示图形。OPC客户端代码是ActiveX控件代码的一部分。OPC客户端在主控制线程之外的单独线程中启动。当MFC对话框上只有一个控件实例时,该控件运行良好。但是,如果我在同一个表单上添加另一个实例,则图形上的曲线开始出现故障。从日志中我可以看到,最终从CWinApp派生的controlapp类只实例化了一次。你知道为什么会搞砸吗?两个实例之间是否共享任何全局变量?我使用的是Visual Studi

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

如果ActiveX控件位于DLL中,则此DLL始终加载到使用ActiveX控件的进程中一次。因此,即使您有多个控件,也通常只有一个CWinApp对象

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

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


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

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