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

 
        如果你的代码量不太,确实不如重写,顺便可以重构一下代码