比如在IE中, 同一进程的两个IE窗口如果都创建我的这个控件那全局就会出现两个IE都用一个全局变量的状况, 这是我不能接受的.
有什么办法改变这一情况么? 我就不能在activex中使用全局变量,同时有让控件支持同一进程多实例么?

解决方案 »

  1.   

    使用同步方法,比如CricitalSection或Mutex.
      

  2.   

    nelsonc(软件兔) :不可能用那些的, 要是用同步保护能解决就好了. 用了这种保护以后, 一个IE工作的时候, 另一个IE岂不挂起了?
      

  3.   

    这种情况当然使用同步了,否则多个线程可能同时用到这个全局变量,这会导致死锁的。另外建议在使用CCriticalSection的时候搭配CSingleLock使用.
      

  4.   

    同步是不能解决问题的。楼主的意思是不是想这几个全局量完全相互独立,不同IE窗口之间互不影响?这就要用到线程存储局部化,可以看看TLS的相关函数。比如TlsSetValue,TlsGetValue其实也可以自己控制。每个线程保存一份全局量,用的时候根据线程句柄找到对应的全局量。TLS估计也是这样实现的
      

  5.   

    网页调用ACTIVEX中的方法 起一个线程,然后线程中通过WaitForSingleObject来判断信号。ACTIVEX还有个方法是来设置 信号,使线程退出,
    结果 同一进程的两个IE窗口如果都这个控件。只要在一个窗口中设置了信号,结果,另外一个窗口中的activex中的线程检测到有信号,也退出了,对于这中情况改怎么处理呀。
      

  6.   

    class CInstansManage  

    public:
    virtual void RemoveAll();
    virtual void LastWork(LPVOID _pGame);
    void RemoveGame(CString _name);
    void RemoveGame(LPVOID _pGame);
    void AddGame(CString _game,LPVOID _pGame);
    CInstansManage();
    virtual ~CInstansManage();
    protected:
    CMapStringToPtr m_games;

    };
    我这里是一个游戏动态库的管理类,其实也是dll,有多个游戏共用,情况类似。
    你应根据实例的名字(guid或名字)来区分,实际上,也就是需要一个管理实例的模块就象类厂。
    实例的增加,减少都需要象这个类注册和注销,最后没有实例后,删除本身。或者你可以实现一个枚举接口,来访问每个实例。
      

  7.   

    to wwwllg(wwwllg) 
     你这个是写在客户端(调用COM) 的,来管理COM实例的,还是 写在COM里面  来管理 COM 还是COM中的线程的。
      

  8.   


       同一进程的两个IE窗口之间实际上并不是楼主所说的同一进程的多个实例,因此我不认为使用锁会
    出现“一个IE工作的时候, 另一个IE挂起”的情况. 至于打开了两个IE进程的话,你的ActiveX控件将被分别映射到两个IE的进程空间之中。