MFC的ActiveX控件,因为里面需要用到CALLBACK的回调函数
来源:互联网 发布:淘宝网的账号不能登录 编辑:程序博客网 时间:2024/06/09 20:03
MFC的ActiveX控件,因为里面需要用到CALLBACK的回调函数,所以用了一些全局变量。结果发现在程序中使用多个控件实例的时候,里面的全局变量是共用的,导致数据错乱。难道ActiveX里面的全局变量是多个实例共用的?有没有比较简单的解决办法。
另外,这些全局变量还在一些纯C的代码里面使用。 问题点数:100、回复次数:18Top
1 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-08 22:48:19 得分 50
是否这样用的
#pragma data_seg("MyData")
int g_iSharedVar = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:MyData,RWS")
去掉#pragma的行即可Top
2 楼lin6194()回复于 2005-11-08 23:16:12 得分 0
不是的,我是在一个自己类的cpp文件中直接声明的:
long g_lSystemStatus;
在其他文件中再声明:
extern long g_lSystemStatus;
我查找了所有文件,没有发现#pragma data_seg定义,只有pragma once。
我印象中ActiveX和现在的DLL都是在自己的独立空间运行的,怎么会这样?Top
3 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-08 23:21:31 得分 0
你使用了多个控件实例,但只加载了一次DLL,所以DLL的hinstance也只有一个,全局变量当然是共用的,你应该用成员变量Top
4 楼lin6194()回复于 2005-11-08 23:23:21 得分 0
我的程序里面还有很多C的代码,实在是不好作成成员变量,还有没有其他解决办法?比如让它强制再加载?Top
5 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-08 23:24:45 得分 0
没有Top
6 楼lin6194()回复于 2005-11-08 23:26:09 得分 0
普通的Dll里面也会有这个问题吗?Top
7 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-08 23:27:55 得分 0
一样,如果你用MFC的扩展DLL导出一个类,创建多个类实例,肯定也是一样的Top
8 楼lin6194()回复于 2005-11-08 23:36:51 得分 0
晕,那怎么样在纯C里面访问这些成员变量?Top
9 楼lin6194()回复于 2005-11-08 23:42:51 得分 0
而且这些C函数都要改成类的方法,否则的话,和全局变量一样,会被多个实例无顺序的调用,岂不是有函数重入的问题,连函数里面的变量都乱套了。怎么办?Top
10 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-08 23:43:43 得分 0
把你用到这个变量的纯C代码改成成员函数,或者把这个变量作为参数传过去Top
11 楼lin6194()回复于 2005-11-08 23:48:49 得分 0
我把这个ActiveX的ID改成一个新的,两个实例用两个不同的控件应该可以用最愚蠢的方式解决吧?Top
12 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-11-09 02:19:58 得分 10
Use win32 thread storage APIs.
Each IE window has its own thread.Top
13 楼lin6194()回复于 2005-11-09 02:25:29 得分 0
jiangsheng(蒋晟.MSMVP2004Jan):能讲的详细一些吗?或给个需要用的API名称,我在MSDN里面查。Top
14 楼SeekTruth(鹤舞白沙)回复于 2005-11-09 15:37:33 得分 30
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
Top
15 楼weiym(磨刀霍霍向猪羊)回复于 2005-11-09 18:28:26 得分 10
就是用线程本地存储Top
16 楼lin6194()回复于 2005-11-09 22:54:33 得分 0
每个变量这么该,工作量不小Top
17 楼lin6194()回复于 2005-11-10 10:45:29 得分 0
如果我新建一个OCX,在这个新OCX中插入一个原来的OCX作为成员变量,再将原来的OCX的属性和方法在这个新的OCX传递导出,在应用程序中使用多个新的OCX,能不能解决这个问题?
我实在是不想改动原来的OCX,因为里面有80个从Linux纯C改过来的函数,还有将近30个全局变量。如果都要改为成员变量,那还不如重写了。
各位帮帮忙,有没有其他愚蠢的外部方法,只要能运行就可以,效率以后再说。Top
18 楼SeekTruth(鹤舞白沙)回复于 2005-11-10 15:43:16 得分 0
如果你的代码量不太,确实不如重写,顺便可以重构一下代码
- MFC的ActiveX控件,因为里面需要用到CALLBACK的回调函数
- 回调函数中响应MFC ActiveX事件的方法
- 回调函数中响应MFC ActiveX事件的方法
- USB库的MSC类里用到的callback回调函数
- 回调函数(Callback Routine)的解释
- callback回调函数的理解
- C++回调函数(callback)的使用
- java CallBack 回调函数的学习
- 回调函数的使用 CallBack
- C++回调函数(callback)的使用
- C++回调函数(callback)的使用
- C++回调函数(callback)的使用
- C++回调函数(callback)的使用
- 回调函数的作用 --callback
- C++回调函数(callback)的使用
- C++回调函数(callback)的使用
- C++回调函数(callback)的使用
- C++回调函数(callback)的运用
- 完整的16位CRC循环校验算法类(c#语言)
- 2009-12-04 | 托盘 图标 闪烁
- 公司绝不会告诉你的10大秘密
- P2P之UDP穿透NAT原理并有UDP打洞的源码
- 第12章 让对象像数值一样工作
- MFC的ActiveX控件,因为里面需要用到CALLBACK的回调函数
- 手机办公平台
- 两种spring的定时器的实现
- struts2之OGNL
- 这些道理不懂,你注定就是穷打工的命
- 分布式计算开源框架Hadoop简介
- CRC16校验原理总结
- meamo
- oracle练习(mldn视频课程)五