在一个视图类中加载一个COM组件对象,在把COM对象传递到一个新线程中使用.出现异常.
实例代码如下:
TestView.h文件如下:public TestView
{
public:
    TestView();
    ~TestView();
    COM_OBJ  m_Comobj;              /*组件对象*/
    void StartThread(void);        /*执行线程函数*/
    static UINT WINAPI CMapxMulitThreadView::ThreadFunc(LPVOID lpParam);  /*线程函数*/
}TestView.cpp文件如下:
TestView::TestView()
{
  ::CoInitializeEx(0,COINIT_MULTITHREADED);   /*多线程使用COM组件*/
}
TestView::~TestView()
{
  ::CoUninitialize();                          /*释放组件*/
}void TestView::StartThread(void)

    UINT threadID = 0;
HANDLE hThreads = (HANDLE)_beginthreadex(NULL,0,CMapxMulitThreadView::ThreadFunc,this,0,&threadID);  /*执行该线程,传递this进线程*/
}       UINT WINAPI TestView::ThreadFunc(LPVOID lpParam)  /*线程函数*/
{ ::CoInitializeEx(NULL,COINIT_MULTITHREADED);        /*多线程调用*/
        TestView* tview = (TestView*)lpParam;        COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef(); 
        tview->Comobj.GetFeatureFactory().CreateLine(vtPoints);   /*调用组件接口,但是出现一个异常*/
        ::CoUninitialize(); 
}异常出现在CreateLine函数中:
它的实现代码如下 :
COM_OBJ COM_OBJ::CreateLine(const VARIANT& Points, const VARIANT& Style)
{
LPDISPATCH result;
static BYTE parms[] =
VTS_VARIANT VTS_VARIANT;
InvokeHelper(0x7, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms,
&Points, &Style);
return CMapXFeature(result);
}
继续跟踪下去:出错函数为:InvokeHelper()
在InvokeHelper()找到出错代码片段:
void COleDispatchDriver::InvokeHelperV(...)
{
   if (FAILED(sc))
   {
         THROW(pException);             /*错误是在这里抛出的*/
    }
}多线程使用COM组件,这个错误是怎么产生的.大家帮忙分析分析,谢谢.

解决方案 »

  1.   

    COM_OBJ 是什么?
    一个com接口的封装类吗?
      

  2.   

    实际问题知道出在了:
    UINT WINAPI TestView::ThreadFunc(LPVOID lpParam)  /*线程函数*/ 
    {        ::CoInitializeEx(NULL,COINIT_MULTITHREADED);        /*多线程调用*/ 
            TestView* tview = (TestView*)lpParam; 
             CMapXPoints points;                              /*COM组件导出对象*/
             points.CreateDispatch(points.GetClsid());        /*创建对象,把这个对象传递给CreateLine出错*/
             COleVariant vtPoints; 
             vtPoints.vt = VT_DISPATCH; 
             vtPoints.pdispVal = points.m_lpDispatch; 
             vtPoints.pdispVal->AddRef(); 
             tview->Comobj.GetFeatureFactory().CreateLine(vtPoints); 
             ::CoUninitialize(); 
    } 但是如过我们改成:

    CMapXPoints m_points;  /*设置成类属性*/
    在这构造函数中创建:
    TestView::TestView() 

      m_Points.CreateDispatch(m_Points.GetClsid());
    } 在在线程函数中传递给CreateLine就不会出现异常:
    例如:
    CMapXPoints points = (tview.m_Points);
    COleVariant vtPoints; 
    vtPoints.vt = VT_DISPATCH; 
    vtPoints.pdispVal = points->m_lpDispatch; 
    vtPoints.pdispVal->AddRef(); 
    tview->Comobj.GetFeatureFactory().CreateLine(vtPoints); 这样就没问题了,为什么会这样呢????
      

  3.   

    COM_OBJ 是什么? 
    一个com接口的封装类吗?
    就是一个从COM组件导出的类.
      

  4.   

    应该是com没有启动就调用了接口,所以报错TestView::TestView() 

      m_Points.CreateDispatch(m_Points.GetClsid()); 
    } 加了这段代码后,在TestView对象构造时是就启动了com,所以不会出错
      

  5.   

    com组件在哪里启动???
    什么意思啊,我用vs2003把COM组件里面的类导入到工程里面就可以用了?你们说的COM组件启动是什么意思.
      

  6.   

    就是调用com接口的时候,会对应的启动它的com server,如果已经启动就不需要了..
      

  7.   

    com指针跨线程使用,需要注意列集,散集处理