我完全按照标准的方法写了一个 ATL COM 部件,并用向导产生了连接点,然后由 VB 来调用这个 COM 部件,并且在 VB 中写了相应的事件处理函数。在 VB 调式环境中运行一切正常,事件能够正常触发,但是当将 VB 程序编译成可执行文件后,老是出内存操作错误,经过跟踪后发现问题出在触发事件的那句代码上,不知道是什么原因,望大挟指点一二。注:在这个 COM 部件中的事件是有一个我自己写的工作线程中调用的
    AfxBeginThread(_DownLoad,this);
 
 
 
 

解决方案 »

  1.   

    我传递的THIS 对象中有一个函数 void myclass::fEvents()
    {
         Fire_MycomEvent();
    }然后我在工作线程中进行调用UINT _DownLoad(LPVOID lParam)
    {
    .....
    .....
      pObj->fEvents();   //出现错误,可是该函数如果不在工作线程中则运行正常
    }
      

  2.   

    这个错误是0x8001010E RPC_E_WRONG_THREAD
    原因是由于你保存的事件接受器接口指针不能直接被另一个线程即你的工作线程所用,必须要进行Marshal调整,你可以通过CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream来传递接口指针
      

  3.   

    zgrong(风之子)
    可以举个详细的例子吗?可以在开帖加分
      

  4.   

    初始化COM时使用CoInitializeEx(NULL, COINIT_MULTITHREADED)
      

  5.   

    可以参见 http://www.mvps.org/vcfaq/com/1.htm
      

  6.   

    初始化COM时使用CoInitializeEx(NULL, COINIT_MULTITHREADED)
      

  7.   

    你的COM对象是STA的,STA要求不同线程之间传递接口指针时,要先列集接口指针,具体可以参考MSDN中的文章:http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q150/7/77.asp&NoWebContent=1。楼上的朋友介绍你的方法是在初始化时将COM组件初始化为MTA组件,MTA组件在线程间传递接口指针时不需要列集/散集的工作。但是,如果你的COM组件在编写时并未考虑到多线程问题的话,用MTA模式初始化COM对象会造成COM对象运行产生错误的结果。你可以参照你自己的程序进行适当的修改。
      

  8.   

    STA套间不能线程之间共享,你要想在另一个线程中
    使用对象,就要现实的把对象列集(Marshal)过去
    以便产生Proxy