设为首页 加入收藏

TOP

实战COM编程系列之三(二)
2012-11-04 15:16:16 来源: 作者: 【 】 浏览:546
Tags:实战 COM 编程 系列 之三
  第二种情况下的调用发起代码

……
// 列集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;
};

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC编程实现OICQ登录号码清除器 下一篇实战COM编程系列之二

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: