没加线程的情况比如:
STDMETHODIMP CMath::Add(long lOp1, long lOp2)
{
   long lResult = lOp1 + lOp2;   if ( m_pCallBack )
       m_pCallBack->FinishEvent( lResult ); return S_OK;

通过回调函数FinishEvent可以成功地通知客户端。现在,我用一个新的线程来处理add计算:
struct ThreadParameters
{
   long           lOp1;
   long           lOp2;
   IStream*       pStream;
};
STDMETHODIMP CMath::Add(long lOp1, long lOp2)
{
      IStream* pStream = 0;
      HRESULT hr = CoMarshalInterThreadInterfaceInStream( IID_ICallBack,
                                                       m_pCallBack,
                                                       &pStream );
      ThreadParameters* pTP = new ThreadParameters;
      pTP->lOp1 = lOp1;
      pTP->lOp2 = lOp2;
      pTP->pStream = pStream;      // Create the thread
      HANDLE  hThread;
      DWORD   dwThreadID;
      hThread = CreateThread( 0, 0,
                              ThreadAdd,
                              pTP,
                              0,
                              &dwThreadID);} 
DWORD WINAPI ThreadAdd( void *p )
{
   CoInitialize( 0 );   ThreadParameters* pTP = (ThreadParameters*) p;   ICallBack* pCallBack = 0;
   HRESULT hr = CoGetInterfaceAndReleaseStream( pTP->pStream,
                                        IID_ICallBack,
                                        (void**) &pCallBack );
   
   if( SUCCEEDED( hr ))
   {
      long lResult;
      lResult = pTP->lOp1 + lOp2;      // Notify the client with the result of the computation
      pCallBack->FinishEvent( lResult ); //这样调用就不好使!
   }   // Delete our thread parameters structure
   delete pTP;   CoUninitialize();
   return hr;
}这样调用就不好使!请大家帮忙,谢谢!

解决方案 »

  1.   

    see the links below ,useful :http://www.codeproject.com/com/statefulcomp.asp
    http://www.codeproject.com/com/comintro2.asp
      

  2.   

    try :
    IGlobalInterfaceTable *g_pGIT = 0;
    DWORD g_dwCookie;//in STDMETHODIMP CMath::Add(long lOp1, long lOp2)
    CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0,
                CLSCTX_INPROC_SERVER, 
                IID_IGlobalInterfaceTable, 
                (void**)&g_pGIT);
    HRESULT hr = g_pGIT->RegisterInterfaceInGlobal(
                       IID_ICallBack, m_pCallBack, &g_dwCookie);//in DWORD WINAPI ThreadAdd( void *p )
    HRESULT hr = g_pGIT->GetInterfaceFromGlobal(
                     g_dwCookie, IID_ICallBack, (void**)&pCallBack);
      

  3.   

    定义一个全局的变量IStream** pStream =new IStream*;
    CoMarshalInterThreadInterfaceInStream 只负责开辟IStream的内存
    但存放指向该内存的指针的空间需要你自己创建
      

  4.   

    你可以试试用MTA。按道理说应该没有问题的。