在ATL中接收事件(AtlAdvise 和 AtlUnadvise的使用)

来源:互联网 发布:两性心理学 知乎 编辑:程序博客网 时间:2024/06/04 18:07

连同实现了缺省的COM 接口实现, ATL提供了两个函数—AtlAdvise 和 AtlUnadvise—使得任何课连接对象的事件接收简单化.

AtlAdvise 函数告诉一个可连接对象客户想从此可连接对象接收事件.该函数封装实现接收事件的步骤1到3. AtlAdvise 理所当然省了大量的时间.就像IConnectionPoint::Advise 方法, AtlAdvise 返回一个cookie供你稍后调用 AtlUnadviseAtlUnadvise 告诉可连接对象客户不再接收事件.

举个例子, ATL应用程序自动化Internet Explorer, 所以你想知道任何IE激发的事件. 为了告知Internet Explorer客户想接收事件,发出对AtlAdvise的调用:

HRESULT hr = AtlAdvise(m_spInetExplorer, GetUnknown(), DIID_DWebBrowserEvents2, &m_dwCookie);

四个参数传递给AtlAdvise. 第一个参数是指向可连接对象的IUnknown 接口的指针. m_spInetExplorer 数据成员是一个经过我们自动化当前运行的Internet Explorer实例的指针. 因为m_spInetExplorer 指向的对象直接或者间接继承自IUnknown, 编译器自动转换m_spInetExplorer 为当前运行的 IE实例的IUnknown 接口指针.

AtlAdvise 第二个参数必须指向提供事件的对象的IUnknown 接口. GetUnknown 函数返回此接口.记住,提供事件的类必须通过某种途径实现 IDispatch in.在此例子中,该类继承自 IDispatch.

第三个参数为你象接收的事件的IID, Internet Explorer 事件的可连接对象的IIS是 DIID_DWebBrowserEvents2.

最后一个参数指向DWORD的指针,该DWORD接收返回的Cookie. 该 cookie 将用于调用 AtlUnadvise.

客户必须实现 IDispatch::Invoke 以控制Internet Explorer 激发的事件. 当你的应用程序完成从IE接收事件, 只需要调用 call AtlUnadvise, 如下:

HRESULT hr = AtlUnadvise(m_spInetExplorer, DIID_DWebBrowserEvents2, m_dwCookie);


注意使用标准C++ 库的 strstream 类来建立字符串.因为ATL 不提供像Cstring的类. 每次从IE接收到事件,建立一个包含事件名称和参数的字符串. 然后显示在列表框中.

退出时候调用AtlUnadvise:

STDMETHODIMP CIEEvtObj::Stop(){   if (m_spInetExplorer) {
HRESULT hr = AtlUnadvise(m_spInetExplorer, DIID_DWebBrowserEvents2, m_dwCookie);
if (FAILED(hr)) ATLTRACE("Failed to Unadvise\n");
}   PostQuitMessage(0);   return S_OK;}
原创粉丝点击