盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

COM对象与连接点机制及其MFC程序完成

时间:2025/1/22作者:未知来源:盾怪网教程人气:

[摘要]IsEqualIID(riid,IID_IEventSink)) *ppvObj = this; AddRef(); return S_OK; else return E_NOINTERFAC...


IsEqualIID(riid,IID_IEventSink))

{

*ppvObj = this;

AddRef();

return S_OK;

}

else

{

return E_NOINTERFACE;

}

}

STDMETHODIMP

CConnClientDlg::XEventSink::EventHandle() //此函数将被可连接对象调用

{

::AfxMessageBox("源对象向事件接收器发出了的通知!");

return S_OK;

}

  4.初始化COM库并创建组件对象实例

  在CConnClientDlg::OninitDialog()中写入:

HRESULT hResult;

hResult = ::CoInitialize(NULL);

if(FAILED(hResult))

{

::AfxMessageBox("不能初始化COM库!");

return FALSE;

}

m_pIUnknown = NULL;

hResult = ::CoCreateInstance(CLSID_ConnObject,NULL,

CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&m_pIUnknown);

if(FAILED(hResult))

{

m_pIUnknown = NULL;

::AfxMessageBox("不能创建ConnObject对象!");

return FALSE;

}

m_dwCookie = 0;//预置连接标识为0
5.在按钮”连接”(IDC_CONNECT)的CLICK事件处理函数void CConnClientDlg::OnConnect()中写入:

void CConnClientDlg::OnConnect()

{

if(m_dwCookie!=0)

{

return;

}

if(m_pIUnknown!=NULL)

{

HRESULT hResult;

hResult = m_pIUnknown->QueryInterface(IID_IConnectionPointContainer,

(void**)&pConnPtCont);

if(FAILED(hResult))

{

::AfxMessageBox("不能获取对象的IConnectionPointContainer接口!");

return;

}

ASSERT(pConnPtCont!=NULL);

hResult = pConnPtCont->FindConnectionPoint(IID_IEventSink,&pConnPt);

if(FAILED(hResult))

{

pConnPtCont->Release();

::AfxMessageBox("不能获取对象的IEventSink连接点接口!");

return;

}

ASSERT(pConnPt!=NULL);

//获取事件接收器指针

IUnknown* pIEventSink;

m_xEventSink.QueryInterface(IID_IUnknown,(void**)&pIEventSink);

//通过连接点接口的Advise方法将事件接收器指针传给可连接对象

if(SUCCEEDED(pConnPt->Advise(pIEventSink,&m_dwCookie)))

{

::AfxMessageBox("与可连接对象ConnObject建立连接成功!");

}

else

{

::AfxMessageBox("不能与ConnObject建立连接!");

}

pConnPt->Release();

pConnPtCont->Release();

return;

}

}


  上述代码与可连接对象的连接点建立连接.

  6.编写按钮”断开”(IDC_DISCONNECT)的CLICK处理函数如下:

void CConnClientDlg::OnDisconnect()

{

if(m_dwCookie==0)

{

return;

}

pConnPt->Unadvise(m_dwCookie);

pConnPt->Release();

pConnPtCont->Release();

m_dwCookie = 0;

}

  7.编写按钮”事件”(IDC_EVENT)的CLICK处理函数:

void CConnClientDlg::OnEvent()

{

if(m_pIUnknown!=NULL)

{

IEventServer* pIEventServer;

HRESULT hResult;

hResult = m_pIUnknown->QueryInterface(IID_IEventServer,(void**)&pIEventServer);

if(FAILED(hResult))

{

::AfxMessageBox("不能获取IEventServer接口!");

return;

}

pIEventServer->DoSomething();

}

}

  这里,客户调用组件提供的服务DoSomething(),而正如前面所看到的,组件对象将在这个函数中触发一个由客户事件接收器处理(CConnClientDlg::XEventSink::EventHandle())的事件.

  8.在退出应用时:

void CConnClientDlg::OnCancel()

{

m_pIUnknown->Release();

::CoUninitialize();

CDialog::OnCancel();

}

  运行程序后,首先点击”连接”,然后点击”事件”按钮,这时将弹出MessageBox,并提示” 源对象向事件接收器发出了的通知!”.

  小结

  正是由于有了可连接对象这一机制,实现了客户与组件对象的双向通信,使组件对象具有了事件机制.这种类似于”服务器推送(Server push)”的技术在分布式应用系统中十分重要.

  本文所举示例是用基于IUnknown接口实现的,其实,用自动化接口IDispatch作为出接口更为方便.需要说明的是,用ATL来写可连接对象更为简洁,MSDN文档中有一个示例.

关键词:COM对象与连接点机制及其MFC程序完成




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版