COM连接点问题

zlopen 2006-08-13 09:28:48
网上下载到一个接收COM组件事件的例子,接收类是从CCmdTarget继承下来的
Advise时看到是这样写的
IUnknown* pUnknownSink = GetInterface(&IID_IUnknown);
m_pConnectionPoint->Advise(pSink, &m_AdviseCookie)
然后通过
BEGIN_DISPATCH_MAP(EventSink, CCmdTarget)
DISP_FUNCTION(EventSink, "Startup",OnAppStartup,VT_EMPTY,VTS_NONE)
END_DISPATCH_MAP()
来接收Startup事件映射到函数OnAppStartup
试了还挺正常,但这句不理解
IUnknown* pUnknownSink = GetInterface(&IID_IUnknown);
IID_IUnknown在unknown.h里,这样取出来的到底是什么?好像msdn上查做sink时都是从IDispatch继承类下来处理,不理解这个,请大家指教
...全文
452 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenchure 2006-08-28
  • 打赏
  • 举报
回复
连接点,其实就是一回调事件 或虚函数, 在 COM 的事件接受端实现的这个虚函数 。不用他的连接点 也可以实现这个功能。
蒋晟 2006-08-28
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/msdnmag/issues/01/03/c/
babyboy 2006-08-27
  • 打赏
  • 举报
回复
IUnknown* pUnknownSink = GetInterface(&IID_IUnknown);
IID_IUnknown在unknown.h里,这样取出来的到底是什么?好像msdn上查做sink时都是从IDispatch继承类下来处理,不理解这个,请大家指教

GetInterface由基类CCCmdTarget实现,你的事件接口从IDispatch,而IDispatch接口是从IUnknown接口继承来的,记住,任何COM接口必须间接或直接从IUnknown接口继承,这是一条规则。所以GetInterface(IID_IUNKNOWN)返回你的事件接口的IUnknown接口指针,因为进行连接的时候,传递是IUnknown类型,在组件内部,会通过这个指针的QueryInterface查找具体的事件家口,进行触发
Fyter 2006-08-14
  • 打赏
  • 举报
回复
用AtlAdvise这个函数


if(SUCCEEDED(AtlAdvise(事件源,接收器,接收器GUID,&Cookie)))
::AfxMessageBox("建立连接成功!");
ldsjlzy 2006-08-14
  • 打赏
  • 举报
回复
做sink跟从哪继承下来没有关系,也可从IUnknown下来,区别是IDispatch是可以通过晚期绑定方式实现某些脚本语言的事件响应.
真相重于对错 2006-08-14
  • 打赏
  • 举报
回复
hr = m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if (FAILED(hr))
return hr;

// Pass our event handlers to the container. Each time an event occurs
// the container will invoke the functions of the IDispatch interface
// we implemented.
hr = spCP->Advise( reinterpret_cast<IDispatch*>(this), &m_dwCookie);

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧