VC++调用COM(含连接点事件)过程

VC++调用COM(含连接点事件)过程: 已COM组件GstRealDb为例,内含接口方法IRealDb和事件_IRealDbEvents,VC++调用过程如下: 1、先建立连COM事件的继承类Sink,类继承自事件接口(_IRealDbEvents),新定义的类必须包含_IRealDbEvents的定义文件,应在 新工程中包含(GstRealDb.h和GstRealDb.tlb)文件,例如: #include "../../GstRealDb/GstRealDb.h" class CRealDbEventsSink : public IDispEventImpl<1, CRealDbEventsSink,&DIID__IRealDbEvents,&LIBID_GSTREALDBLib,1,0> { public: HWND m_hWnd; CRealDbEventsSink(){}; virtual ~CRealDbEventsSink(){}; BEGIN_SINK_MAP(CRealDbEventsSink) // ATL宏映射事件函数 SINK_ENTRY_EX(1, DIID__IRealDbEvents, 1, OnDbInitialize) SINK_ENTRY_EX(1, DIID__IRealDbEvents, 2, OnDbItemAdded) SINK_ENTRY_EX(1, DIID__IRealDbEvents, 3, OnDbItemDeleted) SINK_ENTRY_EX(1, DIID__IRealDbEvents, 4, OnDbItemChanged) SINK_ENTRY_EX(1, DIID__IRealDbEvents, 5, OnDbItemStateChanged) END_SINK_MAP() HRESULT _stdcall OnDbInitialize(); HRESULT _stdcall OnDbItemAdded(IRealDbItem *item); HRESULT _stdcall OnDbItemDeleted(IRealDbItem *item); HRESULT _stdcall OnDbItemChanged(IRealDbItem *item); HRESULT _stdcall OnDbItemStateChanged(IRealDbItem *item, DEVICE_STATE enumOldState, DEVICE_STATE enumNewState); }; 2、函数定义 HRESULT _stdcall CRealDbEventsSink::OnDbInitialize() { ::PostMessage(m_hWnd,WM_REALDB_INIT,0,0); return S_OK; } HRESULT _stdcall CRealDbEventsSink::OnDbItemAdded(IRealDbItem *item) { return S_OK; } HRESULT _stdcall CRealDbEventsSink::OnDbItemDeleted(IRealDbItem *item) { return S_OK; } HRESULT _stdcall CRealDbEventsSink::OnDbItemChanged(IRealDbItem *item) { return S_OK; } HRESULT _stdcall CRealDbEventsSink::OnDbItemStateChanged(IRealDbItem *item,DEVICE_STATE enumOldState,DEVICE_STATE enumNewState) { return S_OK; } 3、定义组件对象指针 IRealDb* m_pRealDb; IRealDbItem* m_pRealDbItem; IUnknown* m_pRealDbUnk; //IUnknown指针 CRealDbEventsSink *m_pRealDbEventsSink; //接口事件指针 4、 HRESULT hr; hr=::CoCreateInstance(CLSID_RealDb,NULL,CLSCTX_INPROC_SERVER,IID_IRealDb,(void**)&m_pRealDb);//创建实例 if(!SUCCEEDED(hr)) { AfxMessageBox("Create RealDb Instance failed!"); return FALSE; } m_pRealDb->QueryInterface(IID_IRealDb,(void**)&m_pRealDbUnk); //查询接口 m_pRealDbEventsSink = new CRealDbEventsSink(); hr = m_pRealDbEventsSink->DispEventAdvise(m_pRealDbUnk);//查询事件 if (!SUCCEEDED(hr)) { AfxMessageBox("DispEventAdvise Failed."); return false; } m_pRealDbEventsSin->m_hWnd=this->m_hWnd;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值