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