科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件实战COM编程系列之三

实战COM编程系列之三

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

由于客户和和组件实现的接口IModule、IModuleSite等都包有界面的传递,出于利用MFC的界面包装功能而都使用MFC来实现。

作者:lop5712 来源:论坛 2007年10月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
第二种情况下的调用发起代码

……
// 列集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;
};
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章