在ActiveX控件中的OnCreate函数中连接服务器,链接成功后全局变量g_bConnect赋值为true,接口函数Fun1中需要判断g_bConnect的值。
在XP和Win7下IE中运行均正常,但是在Win8 IE10中有问题,问题如下:
OnCreate执行完后g_bConnect为true,但是接口函数Fun1中对g_bConnect判断时g_bConnect的值一直是false的(g_bConnect的初始值是false),只有在Fun1函数中对g_bConnect值判断前执行AfxMessageBox方法(弹出一个对话框)g_bConnect的值才能被正确判断。
发现Win8下Fun1函数调用时间略早于OnCreate函数(微秒级,xp和Win7系统下两个函数被调用时间相同)
尝试的方法:用互斥锁和互斥事件的方法,等待OnCreate函数执行完后再对Fun1函数中g_bConnect的值做判断,还是不行,WaitforSingleObject函数总是执行失败。
看到AfxMessageBox是阻塞式的,不太明白,以上问题请教高手回答。

解决方案 »

  1.   

    你这方法对多进程IE不适用吧?每个标签页都可以是一个进程。你的Windows 7测试怎么通过的?
    如果你的服务器只容许一个连接的话可以写一个服务程序连接服务器,然后ActiveX和服务程序通讯。
      

  2.   

    有那么奇怪?
    你的Activex是不是加载了多次、用了多个对象?
      

  3.   

    IE7没有出现我描述的问题,尝试通过修改注册表使IE以单线程方式工作,但是现象依然存在。控件不会出现多次加载的可能,有锁控制的。
      

  4.   

    用iFrame这样的JS框架来加载ocx是很危险的,因为即便你退出这个页面,因为虚拟机没有清理iFrame,所以你的OleCtrl和App都没有及时析构,然后你再创建一个控件,这样他们是公用一个App类的,所以你的全局变量一直没有销毁(直到你关闭IE后才能销毁),你创建的所有控件对象,都是公用一个App内存空间的。尽量不要用全局和在App里加静态成员.
      

  5.   

    和你们JS程序员沟通一下,确保每个页面的ocx能够在关闭该页面的时候析构。
      

  6.   

    fun1中加个循环多次判断g_bConnect的值,如果多次获取到的值是false那就是false了
      

  7.   

    问题出现在ocx控件刚被调用的时候,每次都是重新打开IE测试的。
      

  8.   

    多次循环不行的,单线程。也尝试过sleep。做afxmessagebox操作有什么特别的地方吗?消耗了时间吗?不懂了。