关于问题的具体描述是这样的:
1. 多线程程序
2. 有一个全局的对象池,对象池负责管理对象(包括创建),目的是为了更有效的地利用有限的CMyObj类的对象(因为这个类初始化工作需要花费不少时间)
3. CMyObj对象的初始化中包括创建COM对象,打开接口
4. 对于第一个线程来说,此时全局对象池为空,因此,对象池生成一个CMyObj对象,并用线程的特定参数对其初始化
5. 任意N多个线程(含有相同的参数)访问时,由于参数相同,为此,能够得到通过对象池获得同一个CMyObj的控制权(但在操作上是线程安全的,因为自己进行了临界区处理)。
6. 当第一个线程没有结束之前,其它线程获取到的该CMyObj对象的访问是正常的(包括对该对象中的COM指针的间接访问);但是一旦第一个线程结束,也即创建该COM对象的线程结束,则此时其它线程对该CMyObj对象的COM指针的变成非法。经检查,发现当第一个线程结束时,经由它创建的COM指针的地址就变成无效地址了??!!!基于上面的情况,我的问题就是:
Q1: 虽然我的对象池是全局的,但由于其内部的New操作与创建COM组件的操作,是由线程来调用实现的,因此,这个COM组件就是线程相关的了?其生存周期与该线程一致了?
Q2: 如何让COM指针的生存周期更长一些,不是随着创建它的线程的消失而结束?或者说有什么办法可以解决这样的问题?谢谢先!

解决方案 »

  1.   

    1.CoTaskMemAlloc
    2.GIT(Global Interface Table)
      

  2.   

    不知道这样行不行:
               创建一个全局的指针CMyObj* p,然后由第一个线程进行初始化。
               因为p是全局变量,所以第一个线程结束后,不会完结。
               就和你的对象池一样,生存周期是全局的。
      

  3.   

    TO shilstlezl: 你的做法实际上跟我目前差不多,就像我所描述的,我的CMyObj应该说也是全局的了(因为对象池本身就是全局的)。最关键是COM的初始化,是由某个线程所调用引起的,因此,随之而结束,这才是最要命的。
    TO luohualiushui: 能否说得再详细一点?谢谢
      

  4.   

    找着问题的原因了,原来的作法,这两个函数只要加在全局对象池的构造与析构函数中。现在只要每个线程开始处加上CoInitializeEx(NULL, CONINT_MULTITHREAED);结束处加上CoUninitialize();程序就不出错了:)