没加线程的情况比如:
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;
}这样调用就不好使!请大家帮忙,谢谢!
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;
}这样调用就不好使!请大家帮忙,谢谢!
http://www.codeproject.com/com/comintro2.asp
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);
CoMarshalInterThreadInterfaceInStream 只负责开辟IStream的内存
但存放指向该内存的指针的空间需要你自己创建