一些使用过的技术总结(二)

来源:互联网 发布:js 数组包含数组 编辑:程序博客网 时间:2024/05/18 02:51

2. MFC 接收IE事件的方法

    接收来自com(Activex)事件的方法应该有几种。

   在网页中接收activex控件的方法示例如下:

   <script for="Manager" language="javascript" event= "DispMessage(nCmd,strMsg)" >

                DispMessage(nCmd,strMsg);

   </script>
   <object id = "Manager" classid = "clsid:F6D3258C-B5C7-4F13-8F08-30D4FF55F20D"  width= 0px; height=0px></object>

   MFC库接收ie控件事件方法是写个接收的类,下面的示例代码是接收网页上点击链接事件的。

   DocEvtHandler.h

   #pragma once

#import <mshtml.tlb>

// CDocEvtHandler 命令目标

class CDocEvtHandler : public CCmdTarget
{
 DECLARE_DYNAMIC(CDocEvtHandler)

public:
 CDocEvtHandler();
 virtual ~CDocEvtHandler();

 void OnClick(MSHTML::IHTMLEventObjPtr pEvtObj);

 

 DECLARE_MESSAGE_MAP()
 DECLARE_DISPATCH_MAP()
 DECLARE_INTERFACE_MAP()
};

 

 

   DocEvtHandler.cpp

   #include "stdafx.h"
  #include "DocEvtHandler.h"

IMPLEMENT_DYNAMIC(CDocEvtHandler, CCmdTarget)

CDocEvtHandler::CDocEvtHandler()
{
 EnableAutomation();  // 重要:激活 IDispatch
}

CDocEvtHandler::~CDocEvtHandler()
{

}

BEGIN_MESSAGE_MAP(CDocEvtHandler, CCmdTarget)
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(CDocEvtHandler, CCmdTarget)
 DISP_FUNCTION_ID(CDocEvtHandler,"HTMLELEMENTEVENTS2_ONCLICK",
 DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick,
 VT_EMPTY, VTS_DISPATCH)
END_DISPATCH_MAP()

BEGIN_INTERFACE_MAP(CDocEvtHandler, CCmdTarget)
 INTERFACE_PART(CDocEvtHandler,
 DIID_HTMLButtonElementEvents2, Dispatch)
END_INTERFACE_MAP()

 

 

void CDocEvtHandler::OnClick(MSHTML::IHTMLEventObjPtr pEvtObj)
{
 MSHTML::IHTMLElementPtr pElement =
  pEvtObj->GetsrcElement();

  

   //处理点击网页元素的代码 

   .......................


}

事件处理类继承自CCmdTarget,在CCmdTarget类中有一个成员变量实现了IDispatch接口。

使用此类的方法

CMDITabView.cpp

..............

m_pEventHandler = new CDocEvtHandler;

..............


void CMDITabView::InstallEventHandler()
{
 if(m_dwDocCookie)   // 已安装,卸载先。最后一次安装的才有效
 UninstallEventHandler();

 m_pDispDoc = GetHtmlDocument();
 IConnectionPointContainerPtr pCPC = m_pDispDoc;
 IConnectionPointPtr pCP;
 // 找到安装点
 pCPC->FindConnectionPoint(DIID_HTMLDocumentEvents2, &pCP);
 IUnknown* pUnk = m_pEventHandler->GetInterface(&IID_IUnknown);
 //安装
 HRESULT hr = pCP->Advise(pUnk, &m_dwDocCookie);
 if(!SUCCEEDED(hr))  // 安装失败
  m_dwDocCookie = 0;
}
// 卸载响应函数。省略了一些失败判断以突出主要步骤
void CMDITabView::UninstallEventHandler()
{
 if(0 == m_dwDocCookie) return;

 IConnectionPointContainerPtr pCPC = m_pDispDoc;
 IConnectionPointPtr pCP;
 pCPC->FindConnectionPoint(DIID_HTMLDocumentEvents2, &pCP);
 HRESULT hr = pCP->Unadvise(m_dwDocCookie);
}
肯能比较简单的方法

http://www.cppblog.com/yxm/archive/2006/10/13/13633.html

Atl接收com事件的方法(摘自网络)

接收器类

 

class EventReceiver :  public IDispEventImpl<0,EventReceiver,&DIID__ConnectPointInterface,&LIBID_xxxLib, 1, 0>

{

public:

    STDMETHOD(EventNotify)(int i);

STDMETHODIMP EventReceiver::EventNotify(int i)

{

      //处理事件的代码 

      return S_OK;

}

 

BEGIN_SINK_MAP(EventReceiver)

    SINK_ENTRY_EX(0, DIID__IConnectionPointTestObjEvents, 1, EventNotify)

END_SINK_MAP()

}

类的使用方法

EventReceiver * pReceiver = new EventReceiver;

pReceiver->DispEventAdvise(pObj); //pObj为产生事件的com对象的实例