// 某COM组件CA实现了IA接口。IA接口有一个函数IA_Func1,CA的实现如下:class CA
{
//... 
void CA_Method1();
private:
long m_nValue;
};
HRESULT CA::IA_Func1()
{
CreateThread(NULL,0,threadProc,this,0,NULL);
return S_OK;
}
unsigned long CA::threadProc(LPVOID param)
{
CA *pCA = (CA*)param; //这个转换不确定是否能成功(STA、MTA、DCOM远程组件)
pCA->CA_Method1(); //由于上面的不确定,这里也不确定是否能成功调用
InterlockedIncreament(&pCA->m_nValue); //同上
return 0;
}// threadProc只会调用CA类实现的函数或API函数,不会调用到其他接口;
// 这样能在各种客户端套间环境(STA/MTA/BOTH/None)下正确运行吗?
// CA的ThreadingModal对上述问题的答案有影响吗?
以我的理解,应该转换是安全的,因为不管是否跨越套间,IA_Func1实际上都应该似是在对象创建的套间中执行的,那么传递的this指针就应该能安全的转换为组件的实现类的指针。
如果在转换后调用到了其他的接口(非CA实现的接口,而是包容或聚合的接口)的话,那么转换就是不安全的。请教各位高手,上述结论是否成立?
如果不行的话:由于IA_Func1是个很耗时的操作,所以必须开启工作线程。
在工作线程中如何才能安全的访问到CA类的辅助函数及类变量呢?

解决方案 »

  1.   

    好像不行,我写过差不多的代码(MTA),实际上this指针的指向地址的不是对像本身(但是类型一致,转换时不出错,访问成员变量都是初始值)
    解决办法是全部都过接口方法调用(^_^)。
      

  2.   

    你可以通过将对象注册到系统中,得到一个DWORD dwCookie值,然后该值获取具体的对象类型结构,再进行处理。COM中处理线程要小心在意,很容易一不小心违反了COM的处理方式。
      

  3.   

    转化前,判断是指针是否为NULL吧 更安全~~~~~~
      

  4.   

    转换是可以的。传进去的this指针是对象本身的,即是一个类对象的指针,并不涉及代理存根和套间。
    但是要指出的是,这么用非常危险,也很不合常理。 这么用需要注意以下几个问题:
    1. 这个对象的生命周期问题,确保线程内使用时,这个对象一定存在(因为这个指针已经脱离com引用计数的管理),否则会引起调用野指针的异常。
    2. 线程的管理问题,在对象生命周期结束前,确保这些新创建的线程先结束
    3.线程内调用到的对象的方法,需要进行多线程同步,如果没有涉及共享资源当然也就没这个问题了。