第二种情况下的调用发起代码
…… // 列集IExample1Logic接口指针 IStream *pStream = NULL; if( FAILED( ::CoMarshalInterThreadInterfaceInStream( IID_IExample1Logic, m_pLogic,&pStream ) ) ) { m_pError->ReportHardError( __WFILE__, __LINE__, L"列集IExample1Logic接口失败!" ); return; }
// 发起线程 HANDLE hThread = CreateThread( NULL, 0, Task2, pStream, 0, NULL ); if( !hThread ) { pStream->Release(); m_pError->ReportHardError( __WFILE__,__LINE__,L"任务线程创建失败!" ); return; } ::CloseHandle( hThread ); …… |
第二种情况下的调用线程代码
static DWORD WINAPI Task2( LPVOID pParam ) { ASSERT( pParam ); // 将此线程与MTA套间绑定 ::CoInitializeEx( NULL, COINIT_MULTITHREADED );
// 散集出IExample1Logic接口指针 IExample1Logic *pLogic = NULL; if( FAILED( ::CoGetInterfaceAndReleaseStream( reinterpret_cast< IStream* >( pParam ), IID_IExample1Logic, reinterpret_cast< void** >( &pLogic ) ) ) ) return static_cast< DWORD >( -1 );
// 执行任务 pLogic->Task2();
// 释放资源 pLogic->Release(); ::CoUninitialize();
return 0; } |
第二种情况下的业务组件
业务组件的接口定义
[ object, uuid(348FF439-26B3-495D-85C1-4464CAA98CD9), pointer_default(unique) ] interface IExample1Logic : IUnknown { HRESULT Task1(); HRESULT Task2(); };
[ object, uuid(348FF439-26B3-495D-85C2-4464CAA98CD9), pointer_default(unique) ] interface ISetTaskManager : IUnknown { HRESULT SetTaskManager( [in] ITaskManager *pManager ); };
ITask实现类的头文件代码 class CExample1Logic; class ATL_NO_VTABLE CTask : public CComObjectRootEx< CComMultiThreadModel >, public ITask { // ATL定义宏 DECLARE_NOT_AGGREGATABLE( CTask ) DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP( CTask ) COM_INTERFACE_ENTRY( ITask ) END_COM_MAP()
// 成员变量 protected: float m_Rate; // 当前进度 DWORD m_Cookie; // ITaskManager::AddTask返回的cookie HANDLE m_hEvent; // 等待事件,与CExample1Logic共同合作
// 构造、析构 public: CTask() : m_Rate( 0.0f ), m_Cookie( static_cast< DWORD >( -1 ) ), m_hEvent( NULL ) { // 什么都不做 } ~CTask() { ::CloseHandle( m_hEvent ); }
// 接口实现 public: // ITask STDMETHOD(GetProcessRateOfTask)( float *pRate ); STDMETHOD(TerminateTask)();
// 友员类 friend class CExample1Logic; };
|
|