CWebBrowser2EventsBase 详解

class CWebBrowser2EventsBase
{
protected:
 static ATL::_ATL_FUNC_INFO StatusTextChangeStruct;
 static ATL::_ATL_FUNC_INFO TitleChangeStruct;
 static ATL::_ATL_FUNC_INFO PropertyChangeStruct;
 static ATL::_ATL_FUNC_INFO OnQuitStruct;
 static ATL::_ATL_FUNC_INFO OnToolBarStruct;
 static ATL::_ATL_FUNC_INFO OnMenuBarStruct;
 static ATL::_ATL_FUNC_INFO OnStatusBarStruct;
 static ATL::_ATL_FUNC_INFO OnFullScreenStruct;
 static ATL::_ATL_FUNC_INFO OnTheaterModeStruct;
 static ATL::_ATL_FUNC_INFO DownloadBeginStruct;
 static ATL::_ATL_FUNC_INFO DownloadCompleteStruct;
 static ATL::_ATL_FUNC_INFO NewWindow2Struct; 
 static ATL::_ATL_FUNC_INFO CommandStateChangeStruct;
 static ATL::_ATL_FUNC_INFO BeforeNavigate2Struct;
 static ATL::_ATL_FUNC_INFO ProgressChangeStruct;
 static ATL::_ATL_FUNC_INFO NavigateComplete2Struct;
 static ATL::_ATL_FUNC_INFO DocumentComplete2Struct;
 static ATL::_ATL_FUNC_INFO OnVisibleStruct;
 static ATL::_ATL_FUNC_INFO SetSecureLockIconStruct;
 static ATL::_ATL_FUNC_INFO NavigateErrorStruct;
 static ATL::_ATL_FUNC_INFO PrivacyImpactedStateChangeStruct;
};

__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::StatusTextChangeStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BSTR}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::TitleChangeStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BSTR}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::PropertyChangeStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BSTR}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::DownloadBeginStruct = {CC_STDCALL, VT_EMPTY, 0, {NULL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::DownloadCompleteStruct = {CC_STDCALL, VT_EMPTY, 0, {NULL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnQuitStruct = {CC_STDCALL, VT_EMPTY, 0, {NULL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::NewWindow2Struct = {CC_STDCALL, VT_EMPTY, 2, {VT_BYREF|VT_BOOL,VT_BYREF|VT_DISPATCH}}; 
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::CommandStateChangeStruct = {CC_STDCALL, VT_EMPTY, 2, {VT_I4,VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::BeforeNavigate2Struct = {CC_STDCALL, VT_EMPTY, 7, {VT_DISPATCH,VT_BYREF|VT_VARIANT,VT_BYREF|VT_VARIANT,VT_BYREF|VT_VARIANT,VT_BYREF|VT_VARIANT,VT_BYREF|VT_VARIANT,VT_BYREF|VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::ProgressChangeStruct = {CC_STDCALL, VT_EMPTY, 2, {VT_I4,VT_I4}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::NavigateComplete2Struct = {CC_STDCALL, VT_EMPTY, 2, {VT_DISPATCH, VT_BYREF|VT_VARIANT}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::DocumentComplete2Struct = {CC_STDCALL, VT_EMPTY, 2, {VT_DISPATCH, VT_BYREF|VT_VARIANT}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnVisibleStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnToolBarStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnMenuBarStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnStatusBarStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnFullScreenStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::OnTheaterModeStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::SetSecureLockIconStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_I4}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::NavigateErrorStruct = {CC_STDCALL, VT_EMPTY, 5, {VT_BYREF|VT_BOOL,VT_BYREF|VT_VARIANT,VT_BYREF|VT_VARIANT,VT_BYREF|VT_VARIANT,VT_BYREF|VT_DISPATCH}};
__declspec(selectany) ATL::_ATL_FUNC_INFO CWebBrowser2EventsBase::PrivacyImpactedStateChangeStruct = {CC_STDCALL, VT_EMPTY, 1, {VT_BOOL}};

template <class T, UINT id=0>
class Browser : 
 public CWebBrowser2EventsBase, 
 public ATL::IDispEventSimpleImpl<id, Browser<T,id>, &DIID_DWebBrowserEvents2> 
{
public:
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
 typedef ATL::CString String;
#else
 typedef ATL::CComBSTR String;
#endif
 typedef Browser<T, id> thisClass;

 BEGIN_MSG_MAP(thisClass)
  MESSAGE_HANDLER(WM_CREATE, OnCreate)
  MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
 END_MSG_MAP()

 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
  T* pT = static_cast<T*>(this);
  LRESULT lResult=pT->DefWindowProc();
  HRESULT hResult=pT->QueryControl(IID_IWebBrowser2, (void**)&browser);
  if (SUCCEEDED(hResult))
  {
   if (FAILED(DispEventAdvise(browser, &DIID_DWebBrowserEvents2)))
   {
    ATLASSERT(FALSE);
    browser.Release();
   }
  }
  return lResult;
 }

 LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
 {
  if (browser)
  {
   DispEventUnadvise(browser, &DIID_DWebBrowserEvents2);
   browser.Release();
  }
  bHandled=FALSE;
  return 0;
 }

 BEGIN_SINK_MAP(thisClass)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_STATUSTEXTCHANGE, __StatusTextChange, &StatusTextChangeStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_PROGRESSCHANGE, __ProgressChange, &ProgressChangeStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_COMMANDSTATECHANGE, __CommandStateChange, &CommandStateChangeStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_DOWNLOADBEGIN, __DownloadBegin, &DownloadBeginStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_DOWNLOADCOMPLETE, __DownloadComplete, &DownloadCompleteStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_TITLECHANGE, __TitleChange, &TitleChangeStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, __NavigateComplete2, &NavigateComplete2Struct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, __BeforeNavigate2, &BeforeNavigate2Struct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_PROPERTYCHANGE, __PropertyChange, &PropertyChangeStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, __NewWindow2, &NewWindow2Struct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, __DocumentComplete, &DocumentComplete2Struct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONQUIT, __OnQuit, &OnQuitStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONVISIBLE, __OnVisible, &OnVisibleStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONTOOLBAR, __OnToolBar, &OnToolBarStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONMENUBAR, __OnMenuBar, &OnMenuBarStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONSTATUSBAR, __OnStatusBar, &OnStatusBarStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONFULLSCREEN, __OnFullScreen, &OnFullScreenStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_ONTHEATERMODE, __OnTheaterMode, &OnTheaterModeStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_SETSECURELOCKICON, __SetSecureLockIcon, &SetSecureLockIconStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR, __NavigateError, &NavigateErrorStruct)
  SINK_ENTRY_INFO(id, DIID_DWebBrowserEvents2, DISPID_PRIVACYIMPACTEDSTATECHANGE, __PrivacyImpactedStateChange, &PrivacyImpactedStateChangeStruct)
 END_SINK_MAP()

 void OnSetSecureLockIcon(long nSecureLockIcon) { }
 BOOL OnNavigateError(IDispatch* pDisp, const String& szURL, const String& szTargetFrameName, LONG nStatusCode)
 {  // Return TRUE to cancel
  return FALSE;
 }
 void OnPrivacyImpactedStateChange(BOOL bImpacted) { }
 void OnStatusTextChange(const String& szText) { }
 void OnProgressChange(long nProgress, long nProgressMax) { }
 void OnCommandStateChange(long nCommand, BOOL bEnable) { }
 void OnDownloadBegin() { }
 void OnDownloadComplete() { }
 void OnTitleChange(const String& szTitle) { }
 void OnNavigateComplete2(IDispatch* pDisp, const String& szURL) { }
 BOOL OnBeforeNavigate2(IDispatch* pDisp, const String& szURL, DWORD dwFlags, const String& szTargetFrameName, ATL::CSimpleArray<BYTE>& pPostedData, const String& szHeaders)
 {  // Return TRUE to cancel
  return FALSE;
 }
 void OnPropertyChange(const String& szProperty) { }
 BOOL OnNewWindow2(IDispatch** ppDisp)
 {  // Return TRUE to cancel
  return FALSE;
 }
 void OnDocumentComplete(IDispatch* pDisp, const String& szURL) { }
 void OnQuit() { }
 void OnVisible(BOOL bVisible) { }
 void OnToolBar(BOOL bToolBar) { }
 void OnMenuBar(BOOL bMenuBar) { }
 void OnStatusBar(BOOL bStatusBar) { }
 void OnFullScreen(BOOL bFullScreen) { }
 void OnTheaterMode(BOOL bTheaterMode) { }

protected:
 ATL::CComPtr<IWebBrowser2> browser;

private:
 void __stdcall __SetSecureLockIcon(long nSecureLockIcon)
 {
  T* pT = static_cast<T*>(this);
  pT->OnSetSecureLockIcon(nSecureLockIcon);
 }

 void __stdcall __NavigateError(IDispatch* pDisp, VARIANT* pvURL, VARIANT* pvTargetFrameName, VARIANT* pvStatusCode, VARIANT_BOOL* pbCancel)
 {
  T* pT = static_cast<T*>(this);
  ATLASSERT(V_VT(pvURL) == VT_BSTR);
  ATLASSERT(V_VT(pvTargetFrameName) == VT_BSTR);
  ATLASSERT(V_VT(pvStatusCode) == (VT_I4));
  ATLASSERT(pbCancel != NULL);
  *pbCancel=pT->OnNavigateError(pDisp,V_BSTR(pvURL),V_BSTR(pvTargetFrameName),V_I4(pvStatusCode));
 }

 void __stdcall __PrivacyImpactedStateChange(VARIANT_BOOL bImpacted)
 {
  T* pT = static_cast<T*>(this);
  pT->OnPrivacyImpactedStateChange(bImpacted);
 }

 void __stdcall __StatusTextChange(BSTR szText)
 {
  T* pT = static_cast<T*>(this);
  pT->OnStatusTextChange(szText);
 }

 void __stdcall __ProgressChange(long nProgress, long nProgressMax)
 {
  T* pT = static_cast<T*>(this);
  pT->OnProgressChange(nProgress, nProgressMax);
 }

 void __stdcall __CommandStateChange(long nCommand, VARIANT_BOOL bEnable)
 {
  T* pT = static_cast<T*>(this);
  pT->OnCommandStateChange(nCommand, (bEnable==VARIANT_TRUE) ? TRUE : FALSE);
 }

 void __stdcall __DownloadBegin()
 {
  T* pT = static_cast<T*>(this);
  pT->OnDownloadBegin();
 }

 void __stdcall __DownloadComplete()
 {
  T* pT = static_cast<T*>(this);
  pT->OnDownloadComplete();
 }

 void __stdcall __TitleChange(BSTR szText)
 {
  T* pT = static_cast<T*>(this);
  pT->OnTitleChange(szText);
 }

 void __stdcall __NavigateComplete2(IDispatch* pDisp, VARIANT* pvURL)
 {
  T* pT = static_cast<T*>(this);
  ATLASSERT(V_VT(pvURL) == VT_BSTR);
  pT->OnNavigateComplete2(pDisp, V_BSTR(pvURL));
 }

 void __stdcall __BeforeNavigate2(IDispatch* pDisp, VARIANT* pvURL, VARIANT* pvFlags, VARIANT* pvTargetFrameName, VARIANT* pvPostData, VARIANT* pvHeaders, VARIANT_BOOL* pbCancel)
 {
  T* pT = static_cast<T*>(this);
  ATLASSERT(V_VT(pvURL) == VT_BSTR);
  ATLASSERT(V_VT(pvTargetFrameName) == VT_BSTR);
  ATLASSERT(V_VT(pvPostData) == (VT_VARIANT | VT_BYREF));
  ATLASSERT(V_VT(pvHeaders) == VT_BSTR);
  ATLASSERT(pbCancel != NULL);

  VARIANT* vtPostedData = V_VARIANTREF(pvPostData);
  ATL::CSimpleArray<BYTE> pArray;
  if (V_VT(vtPostedData) & VT_ARRAY)
  {
   ATLASSERT(V_ARRAY(vtPostedData)->cDims == 1 && V_ARRAY(vtPostedData)->cbElements == 1);
   long nLowBound=0,nUpperBound=0;
   SafeArrayGetLBound(V_ARRAY(vtPostedData), 1, &nLowBound);
   SafeArrayGetUBound(V_ARRAY(vtPostedData), 1, &nUpperBound);
   DWORD dwSize=nUpperBound+1-nLowBound;
   LPVOID pData=NULL;
   SafeArrayAccessData(V_ARRAY(vtPostedData),&pData);
   ATLASSERT(pData);

   pArray.m_nSize=pArray.m_nAllocSize=dwSize;
   pArray.m_aT=(BYTE*)malloc(dwSize);
   ATLASSERT(pArray.m_aT);
   CopyMemory(pArray.GetData(), pData, dwSize);
   SafeArrayUnaccessData(V_ARRAY(vtPostedData));
  }
  *pbCancel=pT->OnBeforeNavigate2(pDisp, V_BSTR(pvURL), V_I4(pvFlags), V_BSTR(pvTargetFrameName), pArray, V_BSTR(pvHeaders)) ? VARIANT_TRUE : VARIANT_FALSE;
 }

 void __stdcall __PropertyChange(BSTR szProperty)
 {
  T* pT = static_cast<T*>(this);
  pT->OnPropertyChange(szProperty);
 }

 void __stdcall __NewWindow2(IDispatch** ppDisp, VARIANT_BOOL* pbCancel)
 {
  T* pT = static_cast<T*>(this);
  *pbCancel = pT->OnNewWindow2(ppDisp) ? VARIANT_TRUE : VARIANT_FALSE;
 }

 void __stdcall __DocumentComplete(IDispatch* pDisp, VARIANT* pvURL)
 {
  T* pT = static_cast<T*>(this);
  ATLASSERT(V_VT(pvURL) == VT_BSTR);
  pT->OnDocumentComplete(pDisp, V_BSTR(pvURL));
 }

 void __stdcall __OnQuit()
 {
  T* pT = static_cast<T*>(this);
  pT->OnQuit();
 }

 void __stdcall __OnVisible(VARIANT_BOOL bVisible)
 {
  T* pT = static_cast<T*>(this);
  pT->OnVisible(bVisible == VARIANT_TRUE ? TRUE : FALSE);
 }

 void __stdcall __OnToolBar(VARIANT_BOOL bToolBar)
 {
  T* pT = static_cast<T*>(this);
  pT->OnToolBar(bToolBar == VARIANT_TRUE ? TRUE : FALSE);
 }

 void __stdcall __OnMenuBar(VARIANT_BOOL bMenuBar)
 {
  T* pT = static_cast<T*>(this);
  pT->OnMenuBar(bMenuBar == VARIANT_TRUE ? TRUE : FALSE);
 }

 void __stdcall __OnStatusBar(VARIANT_BOOL bStatusBar)
 {
  T* pT = static_cast<T*>(this);
  pT->OnStatusBar(bStatusBar == VARIANT_TRUE ? TRUE : FALSE);
 }

 void __stdcall __OnFullScreen(VARIANT_BOOL bFullScreen)
 {
  T* pT = static_cast<T*>(this);
  pT->OnFullScreen(bFullScreen == VARIANT_TRUE ? TRUE : FALSE);
 }

 void __stdcall __OnTheaterMode(VARIANT_BOOL bTheaterMode)
 {
  T* pT = static_cast<T*>(this);
  pT->OnTheaterMode(bTheaterMode == VARIANT_TRUE ? TRUE : FALSE);
 }
};

class BrowserView : public ATL::CWindowImpl<BrowserView, ATL::CAxWindow>, public Browser<BrowserView> {
public:
 DECLARE_WND_SUPERCLASS(NULL, ATL::CAxWindow::GetWndClassName())

 BOOL PreTranslateMessage(MSG* pMsg);

 BEGIN_MSG_MAP(BrowserView)
  CHAIN_MSG_MAP(Browser<BrowserView>)
 END_MSG_MAP()

 void OnNavigateComplete2(IDispatch* pDisp, const String& szURL) {

 }
 void OnStatusTextChange(const String& szText) {

 }

 void OnProgressChange(long nProgress, long nProgressMax) {

 }

 void OnSetSecureLockIcon(long nSecureLockIcon) {

 }


protected:
};

 

The output at the debugger:

 

Load module: CheckByVoice.exe
Load module: lpcrt.dll
Load module: rpcrt4.dll
Load module: oleaut32.dll
Load module: fpcrt.dll
Load module: ole32.dll
Load module: aygshell.dll
Load module: commctrl.dll
Load module: coredll.dll
QIThunk - 10            AddRef  :    Object = 0x00090984    Refcount = 1    CAxHostWindow - IDispatch
Load module: CheckByVoice.exe
Unload module: CheckByVoice.exe
Load module: CheckByVoice.exe
Unload module: CheckByVoice.exe
QIThunk - 3             Release :    Object = 0x00090960    Refcount = 1    CAxHostWindow - {00000118-0000-0000-C000-000000000046}
QIThunk - 3             AddRef  :    Object = 0x00090960    Refcount = 2    CAxHostWindow - {00000118-0000-0000-C000-000000000046}
QIThunk - 19            Release :    Object = 0x00090978    Refcount = 0    CAxHostWindow - {6D5140C1-7436-11CE-8034-00AA006009FA}
Load module: CheckByVoice.exe
Unload module: CheckByVoice.exe
QIThunk - 90            AddRef  :    Object = 0x00090978    Refcount = 1    CAxHostWindow - {6D5140C1-7436-11CE-8034-00AA006009FA}
QIThunk - 90            Release :    Object = 0x00090978    Refcount = 0    CAxHostWindow - {6D5140C1-7436-11CE-8034-00AA006009FA}
Load module: CheckByVoice.exe
Unload module: CheckByVoice.exe
QIThunk - 94            Release :    Object = 0x00090978    Refcount = 0    CAxHostWindow - {6D5140C1-7436-11CE-8034-00AA006009FA}
Load module: CheckByVoice.exe
Unload module: CheckByVoice.exe
Load module: CheckByVoice.exe
Unload module: CheckByVoice.exe


This is running on Windows CE 5.0


你可能感兴趣的:(C++,事件,WebBrowser)