HtmlCtrl.h #pragma once #include <afxhtml.h> #include <afxocc.h> #include <MsHtmdid.h> class CHtmlCtrl; class CHtmlNewWndWatch; #include "HtmlFilter.h" class CHtmlCtrl: public CHtmlView { DECLARE_DYNAMIC(CHtmlCtrl) typedef void (AFX_MSG_CALL CCmdTarget::*ADD_MENU_PROC)(CMenu* pPopupMenu, UINT nIndex); enum MENU_TYPE // 上下文菜单 { NoMenu, // 无菜单 DefaultMenu, // 默认菜单 TextSelectionOnly, // 仅文本选择菜单 DefAddMenu, // CustomMenu // 自定义菜单 }; public: CHtmlCtrl(); ~CHtmlCtrl(); // 新加功能 BOOL CreateFromStatic(CWnd *pStaticWnd); BOOL EnableNewWindow(BOOL bNewWindow); BOOL GetNewWindowEnable(); BOOL SetContextMenuMode(MENU_TYPE MenuMode); BOOL SetAddMenu(int nMenuID, CWnd *pMenuNtyWnd = NULL); BOOL SetAddMenuInitProcess(CCmdTarget *pTarget, ADD_MENU_PROC AddMenuProc); BOOL InstallMinme(); BOOL BrowserExeWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT * pvaIn, VARIANT * pvaOut); BOOL CmdTargetExec(DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); // 网页操作 BOOL Web_Find(); BOOL Web_GetFontSize(LONG *pSize); BOOL Web_SetFontSize(LONG lSize); // 成员变量 BOOL m_bNewWindow; HWND m_hStaticWnd; CHtmlView * m_pHtmlView; CString m_DefaultMsgBoxTitle; MENU_TYPE m_MenuType; UINT m_uAddMenuID; CMenu m_DefaultMenu; CWnd * m_pMenuNtyWnd; ADD_MENU_PROC m_AddMenuProc; CCmdTarget * m_pAddMenuTarget; CHtmlFilter m_HtmFilter; CComPtr<IInternetSession> m_pSession; // 原虚函数 virtual BOOL CreateControlSite(COleControlContainer* pContainer,COleControlSite** ppSite, UINT nID, REFCLSID clsid); virtual void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel); virtual void PostNcDestroy() { } virtual void OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel ); virtual HRESULT OnShowContextMenu(DWORD dwID, LPPOINT ppt, LPUNKNOWN pcmdtReserved, LPDISPATCH pdispReserved); virtual HRESULT OnGetOverrideKeyPath(LPOLESTR * pchKey, DWORD dw); virtual BOOL OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar); // 新加虚函数 virtual void OnAppCmd(LPCTSTR lpszWhere); virtual void OnWatchNewWind(LPCTSTR lpszURL); virtual HRESULT OnShowMessage(HWND hwnd,LPOLESTR lpstrText,LPOLESTR lpstrCaption,DWORD dwType,LPOLESTR lpstrHelpFile,DWORD dwHelpContext,LRESULT * plResult); virtual HRESULT OnShowCustomContextMenu(LPPOINT ppt, LPUNKNOWN pcmdtReserved,LPDISPATCH pdispReserved); virtual HRESULT ShowAddMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdTarget, LPDISPATCH pdispReserved); virtual void OnInitAddMenu(CMenu* pPopupMenu, UINT nIndex); // 私有方法 BOOL GetDefaultMenu(DWORD dwID, IUnknown *pcmdTarget, CMenu **ppMenu); private: public: DECLARE_MESSAGE_MAP(); afx_msg void OnDestroy(); afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg); afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/); afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu); }; class CHtmMneuWnd: public CWnd { DECLARE_DYNAMIC(CHtmMneuWnd) public: CHtmMneuWnd() { } CHtmMneuWnd(CHtmlCtrl *pHtmCtrl) { m_pHtmCtrl = pHtmCtrl; } ~CHtmMneuWnd() { } BOOL SetHtmCtrl(CHtmlCtrl *pHtmCtrl) { m_pHtmCtrl = pHtmCtrl; return TRUE; } BOOL SetActionMenu(CMenu *pActionMenu, CMenu *pAddMenu, CString &AddMenuString) { m_pActionMenu = pActionMenu; m_pAddMenu = pAddMenu; m_AddMenuString = AddMenuString; return TRUE; } DECLARE_MESSAGE_MAP(); afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { // int i; CWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); if(pPopupMenu->GetSafeHmenu() == m_pAddMenu->GetSafeHmenu()) { m_pHtmCtrl->OnInitAddMenu(pPopupMenu, nIndex); } if(pPopupMenu->GetSafeHmenu() == m_pActionMenu->GetSafeHmenu()) { pPopupMenu->InsertMenu(0, MF_POPUP | MF_BYPOSITION, (UINT)(__int64)m_pAddMenu->GetSafeHmenu(), m_AddMenuString); } return; } CDWordArray m_IdList; CHtmlCtrl * m_pHtmCtrl; CMenu * m_pActionMenu; CMenu * m_pAddMenu; CString m_AddMenuString; }; class CHtmlNewWndWatch: public CHtmlView { DECLARE_DYNAMIC(CHtmlNewWndWatch) public: CHtmlNewWndWatch(); CHtmlNewWndWatch(CHtmlCtrl *pParent); static CHtmlNewWndWatch * CreateNewWatch(CHtmlCtrl *pParent); static VOID WINAPIV DeleteWatch(); ~CHtmlNewWndWatch(); virtual void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel); CHtmlCtrl *m_pHtmlCtrl; static CHtmlNewWndWatch *s_pOnceInstance; }; class CHtmControlSite : public COleControlSite { public: CHtmControlSite(COleControlContainer * pOCC, CHtmlCtrl* pView); virtual ~CHtmControlSite(); private: CHtmlCtrl * m_pView; // IDocHostShowUI protected: BEGIN_INTERFACE_PART(DocHostShowUI, IDocHostShowUI) INIT_INTERFACE_PART(CHtmControlSite, DocHostShowUI) STDMETHOD(ShowHelp)( /* [in ] */ HWND hwnd, /* [in ] */ LPOLESTR pszHelpFile, /* [in ] */ UINT uCommand, /* [in ] */ DWORD dwData, /* [in ] */ POINT ptMouse, /* [out] */ IDispatch __RPC_FAR *pDispatchObjectHit); STDMETHOD(ShowMessage)( /* [in ] */ HWND hwnd, /* [in ] */ LPOLESTR lpstrText, /* [in ] */ LPOLESTR lpstrCaption, /* [in ] */ DWORD dwType, /* [in ] */ LPOLESTR lpstrHelpFile, /* [in ] */ DWORD dwHelpContext, /* [out] */ LRESULT __RPC_FAR *plResult); END_INTERFACE_PART(DocHostShowUI) // IDocHostUIHandler protected: BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler) STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID, /* [in] */ POINT __RPC_FAR *ppt, /* [in] */ IUnknown __RPC_FAR *pcmdtReserved, /* [in] */ IDispatch __RPC_FAR *pdispReserved); STDMETHOD(GetHostInfo)( /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo); STDMETHOD(ShowUI)( /* [in] */ DWORD dwID, /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject, /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget, /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame, /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc); STDMETHOD(HideUI)(void); STDMETHOD(UpdateUI)(void); STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable); STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable); STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable); STDMETHOD(ResizeBorder)( /* [in] */ LPCRECT prcBorder, /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow, /* [in] */ BOOL fRameWindow); STDMETHOD(TranslateAccelerator)( /* [in] */ LPMSG lpMsg, /* [in] */ const GUID __RPC_FAR *pguidCmdGroup, /* [in] */ DWORD nCmdID); STDMETHOD(GetOptionKeyPath)( /* [out] */ LPOLESTR __RPC_FAR *pchKey, /* [in] */ DWORD dw); STDMETHOD(GetDropTarget)( /* [in] */ IDropTarget __RPC_FAR *pDropTarget, /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget); STDMETHOD(GetExternal)( /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch); STDMETHOD(TranslateUrl)( /* [in] */ DWORD dwTranslate, /* [in] */ OLECHAR __RPC_FAR *pchURLIn, /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut); STDMETHOD(FilterDataObject)( /* [in] */ IDataObject __RPC_FAR *pDO, /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet); END_INTERFACE_PART(DocHostUIHandler) #if (_WIN32_IE >= 0x0501) // IE 5.5 and higher // IDocHostUIHandler2 protected: BEGIN_INTERFACE_PART(DocHostUIHandler2, IDocHostUIHandler2) STDMETHOD(GetOverrideKeyPath)( /* [out] */ LPOLESTR __RPC_FAR *pchKey, /* [in] */ DWORD dw); STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID, /* [in] */ POINT __RPC_FAR *ppt, /* [in] */ IUnknown __RPC_FAR *pcmdtReserved, /* [in] */ IDispatch __RPC_FAR *pdispReserved); STDMETHOD(GetHostInfo)( /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo); STDMETHOD(ShowUI)( /* [in] */ DWORD dwID, /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject, /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget, /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame, /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc); STDMETHOD(HideUI)(void); STDMETHOD(UpdateUI)(void); STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable); STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable); STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable); STDMETHOD(ResizeBorder)( /* [in] */ LPCRECT prcBorder, /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow, /* [in] */ BOOL fRameWindow); STDMETHOD(TranslateAccelerator)( /* [in] */ LPMSG lpMsg, /* [in] */ const GUID __RPC_FAR *pguidCmdGroup, /* [in] */ DWORD nCmdID); STDMETHOD(GetOptionKeyPath)( /* [out] */ LPOLESTR __RPC_FAR *pchKey, /* [in] */ DWORD dw); STDMETHOD(GetDropTarget)( /* [in] */ IDropTarget __RPC_FAR *pDropTarget, /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget); STDMETHOD(GetExternal)( /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch); STDMETHOD(TranslateUrl)( /* [in] */ DWORD dwTranslate, /* [in] */ OLECHAR __RPC_FAR *pchURLIn, /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut); STDMETHOD(FilterDataObject)( /* [in] */ IDataObject __RPC_FAR *pDO, /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet); END_INTERFACE_PART(DocHostUIHandler2) #endif // Implement IInternetSecurityManager BEGIN_INTERFACE_PART(InternetSecurityManager, IInternetSecurityManager) STDMETHOD(SetSecuritySite)(IInternetSecurityMgrSite*); STDMETHOD(GetSecuritySite)(IInternetSecurityMgrSite**); STDMETHOD(MapUrlToZone)(LPCWSTR,DWORD*,DWORD); STDMETHOD(GetSecurityId)(LPCWSTR,BYTE*,DWORD*,DWORD); STDMETHOD(ProcessUrlAction)( /* [in] */ LPCWSTR pwszUrl, /* [in] */ DWORD dwAction, /* [size_is][out] */ BYTE __RPC_FAR *pPolicy, /* [in] */ DWORD cbPolicy, /* [in] */ BYTE __RPC_FAR *pContext, /* [in] */ DWORD cbContext, /* [in] */ DWORD dwFlags, /* [in] */ DWORD dwReserved = 0); STDMETHOD(QueryCustomPolicy)(LPCWSTR,REFGUID,BYTE**,DWORD*,BYTE*,DWORD,DWORD); STDMETHOD(SetZoneMapping)(DWORD,LPCWSTR,DWORD); STDMETHOD(GetZoneMappings)(DWORD,IEnumString**,DWORD); END_INTERFACE_PART(InternetSecurityManager) /// Implement IServiceProvider BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider) STDMETHOD(QueryService)(REFGUID,REFIID,void**); END_INTERFACE_PART(ServiceProvider) BEGIN_INTERFACE_PART(MyAmbientProps, IDispatch) // INIT_INTERFACE_PART(CHtmControlSite, MyAmbientProps) STDMETHOD(GetTypeInfoCount)(unsigned int*); STDMETHOD(GetTypeInfo)(unsigned int, LCID, ITypeInfo**); STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, unsigned int, LCID, DISPID*); STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr); END_INTERFACE_PART(MyAmbientProps) DECLARE_INTERFACE_MAP() }; HtmlCtrl.cpp // If this code works, it was written by Paul DiLascia. // If not, I don't know who wrote it. // Compiles with Visual C++ 6.0, runs on Windows 98 and probably NT too. // #include "StdAfx.h" #include "HtmlCtrl.h" #include <IDispIds.h> //#define HCT_TRACE ATLTRACE #define HCT_TRACE __noop #define ID_MYUSED_BASE 30000 #define WM_CREATE_HTM WM_USER + 1231 #define MENU_ID_GOTO ID_MYUSED_BASE + 0 #define MENU_ID_HOST ID_MYUSED_BASE + 1 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif / // CHtmlCtrl / CHtmlCtrl::CHtmlCtrl() { m_bNewWindow = FALSE; m_MenuType = DefaultMenu; m_pAddMenuTarget = NULL; m_AddMenuProc = NULL; } CHtmlCtrl::~CHtmlCtrl() { } IMPLEMENT_DYNAMIC(CHtmlCtrl, CHtmlView) BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView) ON_WM_DESTROY() ON_WM_MOUSEACTIVATE() ON_WM_CONTEXTMENU() ON_WM_INITMENUPOPUP() END_MESSAGE_MAP() void CHtmlCtrl::OnDestroy() { // if (m_pBrowserApp) { // m_pBrowserApp->Release(); // m_pBrowserApp = NULL; // } CHtmlView::OnDestroy(); // bypass CView doc/frame stuff } int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg) { // bypass CView doc/frame stuff return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg); } void CHtmlCtrl::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/) { // TODO: Add your message handler code here } void CHtmlCtrl::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CHtmlView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); // TODO: Add your message handler code here } // 消息映射函数 结束 // // // 新加功能 开始 BOOL CHtmlCtrl::CreateFromStatic(CWnd *pStaticWnd) { CWnd * pParent; int nID; pParent = pStaticWnd->GetParent(); nID = pStaticWnd->GetDlgCtrlID(); // Get static control rect, convert to parent's client coords. CRect rc; pStaticWnd->GetWindowRect(&rc); pParent->ScreenToClient(&rc); pStaticWnd->ShowWindow(SW_HIDE); pStaticWnd->DestroyWindow(); // create HTML control (CHtmlView) return Create(NULL, // class name NULL, // title (WS_CHILD | WS_VISIBLE ), // style rc, // rectangle pParent, // parent nID, // control ID NULL); // frame/doc context not used } BOOL CHtmlCtrl::EnableNewWindow(BOOL bNewWindow) { m_bNewWindow = bNewWindow; return TRUE; } BOOL CHtmlCtrl::GetNewWindowEnable() { return m_bNewWindow; } BOOL CHtmlCtrl::SetContextMenuMode(MENU_TYPE MenuMode) { m_MenuType = MenuMode; return TRUE; } BOOL CHtmlCtrl::SetAddMenu(int nMenuID, CWnd *pMenuNtyWnd) { m_uAddMenuID = nMenuID; if(pMenuNtyWnd == NULL) m_pMenuNtyWnd = this->GetParent(); else m_pMenuNtyWnd = pMenuNtyWnd; SetContextMenuMode(DefAddMenu); return TRUE; } BOOL CHtmlCtrl::SetAddMenuInitProcess(CCmdTarget *pTarget, ADD_MENU_PROC AddMenuProc) { m_AddMenuProc = AddMenuProc; m_pAddMenuTarget = pTarget; return TRUE; } BOOL CHtmlCtrl::InstallMinme() { HRESULT hr; CComPtr<IClassFactory> spFact; WCHAR *pMime; int i; hr = ::CoInternetGetSession(0, &m_pSession, 0); if(FAILED(hr)) return FALSE; // m_HtmFilter.QueryInterface(IID_ICallFactory, (LPVOID *)&spFact); spFact = &m_HtmFilter; hr = FindMimeFromData(NULL, L"*.htm", NULL, 0, NULL, 0, &pMime, 0); hr = FindMimeFromData(NULL, L"*.js", NULL, 0, NULL, 0, &pMime, 0); hr = FindMimeFromData(NULL, L"*.css", NULL, 0, NULL, 0, &pMime, 0); // hr = FindMimeFromData(NULL, L"*.jpg", NULL, 0, NULL, 0, &pMime, 0); m_HtmFilter.AddRef(); #if 0 m_HtmFilter.m_nFilterType = Filter_namespcae; hr = m_pSession->RegisterNameSpace(spFact, CLSID_HtmlFilter, L"http", 0, NULL, 0); #else WCHAR *pFilterList[] = { L"application/x-javascript", L"", L"text/html", L"text/javascrip", L"image/gif", L"image/x-xbitmap", L"image/jpeg", L"image/pjpeg", L"application/x-shockwave-flash", L"application/vnd.ms-powerpoint", L"application/vnd.ms-excel", L"application/msword", L"application/x-silverlight", L"*/*", NULL }; m_HtmFilter.m_nFilterType = Filter_Mime; for(i=0; pFilterList[i]; i++) { hr = m_pSession->RegisterMimeFilter(spFact, CLSID_HtmlFilter, pFilterList[i]); } #endif if(FAILED(hr)) return FALSE; return TRUE; } // 新加功能 结束 // BOOL CHtmlCtrl::BrowserExeWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT * pvaIn, VARIANT * pvaOut) { CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> spWebBrowser2; HRESULT hr; spWebBrowser2 = m_pBrowserApp; hr = spWebBrowser2->ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut); if(FAILED(hr)) { assert(0); return FALSE; } return TRUE; } BOOL CHtmlCtrl::CmdTargetExec(DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) { CComPtr<IOleCommandTarget> pCmd; CComPtr<IHTMLDocument2> pDoc; HRESULT hr; pDoc = (IHTMLDocument2 *)GetHtmlDocument(); pCmd = pDoc; if(pCmd == NULL) { assert(0); return FALSE; } hr = pCmd->Exec(&CGID_MSHTML, nCmdID, nCmdexecopt, pvaIn, pvaOut); if(FAILED(hr)) { assert(0); return FALSE; } return TRUE; } BOOL CHtmlCtrl::Web_Find() { _variant_t vtIn, vtOut; BOOL bRetVal; bRetVal = CmdTargetExec(IDM_FIND, OLECMDEXECOPT_DODEFAULT, &vtIn, &vtOut); return bRetVal; } BOOL CHtmlCtrl::Web_GetFontSize(LONG *pSize) { _variant_t vtIn, vtOut; BOOL bRetVal; bRetVal = BrowserExeWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &vtIn, &vtOut); if(bRetVal) *pSize = vtOut.lVal; else *pSize = -1; return bRetVal; } BOOL CHtmlCtrl::Web_SetFontSize(LONG lSize) { _variant_t vtIn, vtOut; BOOL bRetVal; vtIn = lSize; bRetVal = BrowserExeWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &vtIn, &vtOut); if(vtOut.lVal != lSize) assert(0); return bRetVal; } // // 原虚函数 开始 BOOL CHtmlCtrl::CreateControlSite(COleControlContainer * pContainer, COleControlSite ** ppSite, UINT /*nID*/, REFCLSID /*clsid*/) { *ppSite = new CHtmControlSite(pContainer, this);// 创建自己的控制站点实例 return (*ppSite) ? TRUE : FALSE; } void CHtmlCtrl::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel) { CHtmlNewWndWatch * pWatch; if(m_bNewWindow) return; pWatch = CHtmlNewWndWatch::CreateNewWatch(this); pWatch->SetRegisterAsBrowser(FALSE); *ppDisp = pWatch->GetApplication(); return; } void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel) { const TCHAR APP_PROTOCOL[] = _T("app:"); int len = (int)_tcslen(APP_PROTOCOL); if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0) { OnAppCmd(lpszURL + len); *pbCancel = TRUE; } return CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel); } // 原虚函数 结束 // // // 新加虚函数 开始 void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere) { // default: do nothing } void CHtmlCtrl::OnWatchNewWind(LPCTSTR lpszURL) { this->Navigate(lpszURL); } HRESULT CHtmlCtrl::OnShowContextMenu(DWORD dwID, LPPOINT ppt,LPUNKNOWN pcmdtReserved, LPDISPATCH pdispReserved) { HRESULT result = S_FALSE; switch(m_MenuType) { case NoMenu: // 无菜单 result=S_OK; break; case DefaultMenu: // 默认菜单 break; case TextSelectionOnly: // 仅文本选择菜单 if(!(dwID == CONTEXT_MENU_TEXTSELECT || dwID == CONTEXT_MENU_CONTROL)) result = S_OK; break; case DefAddMenu: result = ShowAddMenu(dwID, ppt, pcmdtReserved, pdispReserved); break; case CustomMenu: // 自定义菜单 if(dwID != CONTEXT_MENU_TEXTSELECT) result = OnShowCustomContextMenu(ppt, pcmdtReserved, pdispReserved); break; } return result; } HRESULT CHtmlCtrl::OnGetOverrideKeyPath(LPOLESTR * pchKey, DWORD dw) { return S_OK; } #define CheckSwitchTrace(_X) / case _X:/ HCT_TRACE("OnAmbientProperty:" #_X "/n"); BOOL CHtmlCtrl::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar) { BOOL bRetVal; _variant_t vtVal; _bstr_t bStrAgent; switch(dispid) { // 普通,编辑模式 CheckSwitchTrace(DISPID_AMBIENT_USERMODE); break; // 离线检测 CheckSwitchTrace(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); break; // CheckSwitchTrace(DISPID_AMBIENT_SILENT); break; // 文件下载控制 CheckSwitchTrace(DISPID_AMBIENT_DLCONTROL); break; // 用户标记 CheckSwitchTrace(DISPID_AMBIENT_USERAGENT); bStrAgent = "TinyIE1.0"; vtVal = bStrAgent; *pvar = vtVal.Detach(); return TRUE; break; // 调色板 CheckSwitchTrace(DISPID_AMBIENT_PALETTE); break; default: TRACE("OnAmbientProperty: %08X/n", dispid); } bRetVal = CHtmlView::OnAmbientProperty(pSite, dispid, pvar); return bRetVal; } #define IDS_MESSAGE_BOX_TITLE 2213 HRESULT CHtmlCtrl::OnShowMessage(HWND hwnd,LPOLESTR lpstrText,LPOLESTR lpstrCaption,DWORD dwType,LPOLESTR lpstrHelpFile,DWORD dwHelpContext,LRESULT * plResult) { // 窗口标题"Microsoft Internet Explorer"的资源标识 //载入Shdoclc.dll 和IE消息框标题字符串 HINSTANCE hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); if (hinstSHDOCLC == NULL) return S_FALSE; CString strBuf,strCaption(lpstrCaption); strBuf.LoadString(hinstSHDOCLC, IDS_MESSAGE_BOX_TITLE); // 比较IE消息框标题字符串和lpstrCaption // 如果相同,用自定义标题替换 if(strBuf==lpstrCaption) strCaption = m_DefaultMsgBoxTitle; // 创建自己的消息框并且显示 *plResult = MessageBox(CString(lpstrText), strCaption, dwType); //卸载Shdoclc.dll并且返回 FreeLibrary(hinstSHDOCLC); return S_OK; } HRESULT CHtmlCtrl::OnShowCustomContextMenu(LPPOINT ppt, LPUNKNOWN pcmdtReserved,LPDISPATCH pdispReserved) { return S_OK; } #define IDR_BROWSE_CONTEXT_MENU 24641 #define IDR_FORM_CONTEXT_MENU 24640 #define SHDVID_GETMIMECSETMENU 27 #define SHDVID_ADDMENUEXTENSIONS 53 BOOL CHtmlCtrl::GetDefaultMenu(DWORD dwID, IUnknown *pcmdTarget, CMenu **ppMenu) { CMenu * pMenu; HMENU hMenu; HRESULT hr; HINSTANCE hinstSHDOCLC; MENUITEMINFO mii = {0}; CComVariant var, var1, var2; CComPtr<IOleCommandTarget> spCT; hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT); hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); if(hinstSHDOCLC == NULL) { return FALSE; } m_DefaultMenu.DestroyMenu(); hMenu = ::LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU)); m_DefaultMenu.Attach(hMenu); // m_DefaultMenu.LoadMenu(MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU)); pMenu = m_DefaultMenu.GetSubMenu(dwID); // Get the language SubMenu hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var); mii.cbSize = sizeof(mii); mii.fMask = MIIM_SUBMENU; mii.hSubMenu = (HMENU) var.byref; // Add language SubMenu to Encoding context item pMenu->SetMenuItemInfo(IDM_LANGUAGE, &mii, FALSE); // Insert Shortcut Menu Extensions from registry V_VT(&var1) = VT_INT_PTR; V_BYREF(&var1) = pMenu->GetSafeHmenu(); V_VT(&var2) = VT_I4; V_I4(&var2) = dwID; hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2); // Remove View Source // pMenu->DeleteMenu(IDM_VIEWSOURCE, MF_BYCOMMAND);//删除“查看源文件”菜单项 FreeLibrary(hinstSHDOCLC); *ppMenu = pMenu; return TRUE; } HRESULT CHtmlCtrl::ShowAddMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdTarget, LPDISPATCH pdispReserved) { HRESULT hr; HWND hwnd; CMenu * pPopMenu; CMenu * pAddMenu; CMenu AddMenu; BOOL bRetVal; CHtmMneuWnd IeMenWnd(this); CWnd * pIEWnd; CString cStrText; CComPtr<IOleWindow> spWnd; hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd); hr = spWnd->GetWindow(&hwnd);//取得浏览器窗口句柄 pIEWnd = CWnd::FromHandle(hwnd); bRetVal = GetDefaultMenu(dwID, pcmdTarget, &pPopMenu); if(bRetVal == FALSE) return S_OK; AddMenu.LoadMenu(m_uAddMenuID); AddMenu.GetMenuString(0, cStrText, MF_BYPOSITION); pAddMenu = AddMenu.GetSubMenu(0); // OnInsertMenuAddMenu(dwID, pAddMenu); // pPopMenu->InsertMenu(0, MF_POPUP | MF_BYPOSITION, (UINT)pAddMenu->GetSafeHmenu(), cStrText); IeMenWnd.SetActionMenu(pPopMenu, pAddMenu, cStrText); IeMenWnd.SubclassWindow(hwnd); int iSelection = pPopMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, //返回用户选择的菜单命令ID ppt->x, ppt->y, pIEWnd); pPopMenu->DeleteMenu(0, MF_BYPOSITION); // Send selected shortcut menu item command to shell m_pMenuNtyWnd->SendMessage(WM_COMMAND, iSelection, NULL); SendMessage(WM_COMMAND, iSelection, NULL); //发送到Internet Explorer_Server进行内部处理。 LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); pIEWnd->Detach(); IeMenWnd.UnsubclassWindow(); return S_OK; } void CHtmlCtrl::OnInitAddMenu(CMenu* pPopupMenu, UINT nIndex) { if(m_pAddMenuTarget) { (m_pAddMenuTarget->*m_AddMenuProc)(pPopupMenu, nIndex); } return; } // 新加虚函数 结束 // IMPLEMENT_DYNAMIC(CHtmMneuWnd, CWnd) BEGIN_MESSAGE_MAP(CHtmMneuWnd, CWnd) ON_WM_INITMENUPOPUP() END_MESSAGE_MAP() /* CHtmMneuWnd::CHtmMneuWnd() { } CHtmMneuWnd::CHtmMneuWnd(CHtmlCtrl *pHtmCtrl) { m_pHtmCtrl = pHtmCtrl; } CHtmMneuWnd::~CHtmMneuWnd() { } BOOL CHtmMneuWnd::SetEnableList(CDWordArray &IdList) { m_IdList.Copy(IdList); return TRUE; } BOOL CHtmMneuWnd::AddEnableId(DWORD nId) { m_IdList.Add(nId); return TRUE; } BOOL CHtmMneuWnd::AddEnableId(CMenu *pMenu) { int nCount; int i; int nID; nCount = pMenu->GetMenuItemCount(); for(i=0; i<nCount; i++) { nID = pMenu->GetMenuItemID(i); AddEnableId(nID); } return TRUE; } BOOL CHtmMneuWnd::SetHtmCtrl(CHtmlCtrl *pHtmCtrl) { m_pHtmCtrl = pHtmCtrl; return TRUE; } void CHtmMneuWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); int i; BOOL bRetVal; pPopupMenu->AppendMenu(MF_STRING, 34534, "345346"); for(i=0; i<m_IdList.GetSize(); i++) { // pPopupMenu->InsertMenu() pPopupMenu->EnableMenuItem(m_IdList[i], MF_BYCOMMAND | MF_ENABLED); // pPopupMenu->CheckMenuItem(m_IdList[i], TRUE); } } */ / // CHtmlNewWndWatch / CHtmlNewWndWatch * CHtmlNewWndWatch::s_pOnceInstance = NULL; IMPLEMENT_DYNAMIC(CHtmlNewWndWatch, CHtmlView) CHtmlNewWndWatch::CHtmlNewWndWatch() { } CHtmlNewWndWatch::CHtmlNewWndWatch(CHtmlCtrl *pParent) { m_pHtmlCtrl = pParent; } CHtmlNewWndWatch * CHtmlNewWndWatch::CreateNewWatch(CHtmlCtrl *pParent) { if(s_pOnceInstance == NULL) { s_pOnceInstance = new CHtmlNewWndWatch(pParent); s_pOnceInstance->Create(NULL, NULL, (WS_CHILD | WS_VISIBLE ), CRect(0, 0, 0, 0), pParent->GetParent(), 0, NULL); atexit(DeleteWatch); } return s_pOnceInstance; } VOID CHtmlNewWndWatch::DeleteWatch() { if(s_pOnceInstance) { // delete s_pOnceInstance; } } CHtmlNewWndWatch::~CHtmlNewWndWatch() { } void CHtmlNewWndWatch::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel) { if(m_pHtmlCtrl) m_pHtmlCtrl->OnWatchNewWind(lpszURL); *pbCancel = TRUE; return; } /// // CHtmControlSite /// #if _MFC_VER >= 0x0700 #include <afxocc.h> #else #ifdef _AFXDLL #undef AFX_DATA #define AFX_DATA AFX_DATA_IMPORT #endif #include <../src/occimpl.h> #ifdef _AFXDLL #undef AFX_DATA #define AFX_DATA AFX_DATA_EXPORT #endif #endif #include <mshtmhst.h> BEGIN_INTERFACE_MAP(CHtmControlSite, COleControlSite) INTERFACE_PART(CHtmControlSite, IID_IDocHostShowUI, DocHostShowUI) INTERFACE_PART(CHtmControlSite, IID_IDocHostUIHandler, DocHostUIHandler) #if (_WIN32_IE >= 0x0501) // IE 5.5 and higher INTERFACE_PART(CHtmControlSite, IID_IDocHostUIHandler2, DocHostUIHandler2) #endif INTERFACE_PART(CHtmControlSite, IID_IInternetSecurityManager, InternetSecurityManager) INTERFACE_PART(CHtmControlSite, IID_IServiceProvider, ServiceProvider) INTERFACE_PART(CHtmControlSite, IID_IDispatch, MyAmbientProps) END_INTERFACE_MAP() CHtmControlSite::CHtmControlSite(COleControlContainer * pOcc, CHtmlCtrl* pView) : COleControlSite( pOcc ) { m_pView = pView; } CHtmControlSite::~CHtmControlSite() { } ULONG CHtmControlSite::XDocHostShowUI::AddRef() { METHOD_PROLOGUE(CHtmControlSite, DocHostShowUI); return pThis->ExternalAddRef(); } ULONG CHtmControlSite::XDocHostShowUI::Release() { METHOD_PROLOGUE(CHtmControlSite, DocHostShowUI); return pThis->ExternalRelease(); } HRESULT CHtmControlSite::XDocHostShowUI::QueryInterface(REFIID riid, void ** ppvObj) { METHOD_PROLOGUE(CHtmControlSite, DocHostShowUI); return pThis->ExternalQueryInterface( &riid, ppvObj ); } HRESULT CHtmControlSite::XDocHostShowUI::ShowHelp(HWND hwnd, LPOLESTR pszHelpFile, UINT nCommand, DWORD dwData, POINT ptMouse, IDispatch * pDispatchObjectHit) { METHOD_PROLOGUE(CHtmControlSite, DocHostShowUI); return E_NOTIMPL; } HRESULT CHtmControlSite::XDocHostShowUI::ShowMessage(HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption, DWORD dwType, LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT * plResult) { METHOD_PROLOGUE(CHtmControlSite, DocHostShowUI); return pThis->m_pView->OnShowMessage(hwnd,lpstrText,lpstrCaption,dwType,lpstrHelpFile,dwHelpContext,plResult); } ULONG CHtmControlSite::XDocHostUIHandler::AddRef() { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->ExternalAddRef(); } ULONG CHtmControlSite::XDocHostUIHandler::Release() { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->ExternalRelease(); } HRESULT CHtmControlSite::XDocHostUIHandler::QueryInterface(REFIID riid, void ** ppvObj) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->ExternalQueryInterface( &riid, ppvObj ); } HRESULT CHtmControlSite::XDocHostUIHandler::GetHostInfo(DOCHOSTUIINFO * pInfo) { // pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER; //去掉3D边框 // pInfo->dwFlags = DOCHOSTUIFLAG_SCROLL_NO; // 去掉滚动条 METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnGetHostInfo( pInfo ); } HRESULT CHtmControlSite::XDocHostUIHandler::ShowUI(DWORD dwID, IOleInPlaceActiveObject * pActiveObject, IOleCommandTarget * pCommandTarget, IOleInPlaceFrame * pFrame, IOleInPlaceUIWindow * pDoc) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnShowUI( dwID, pActiveObject, pCommandTarget, pFrame, pDoc ); } HRESULT CHtmControlSite::XDocHostUIHandler::HideUI() { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnHideUI(); } HRESULT CHtmControlSite::XDocHostUIHandler::UpdateUI() { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnUpdateUI(); } HRESULT CHtmControlSite::XDocHostUIHandler::EnableModeless(BOOL fEnable) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnEnableModeless( fEnable ); } HRESULT CHtmControlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL fEnable) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnDocWindowActivate( fEnable ); } HRESULT CHtmControlSite::XDocHostUIHandler::OnFrameWindowActivate(BOOL fEnable) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnFrameWindowActivate( fEnable ); } HRESULT CHtmControlSite::XDocHostUIHandler::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow * pUIWindow, BOOL fFrameWindow) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnResizeBorder( prcBorder, pUIWindow, fFrameWindow ); } HRESULT CHtmControlSite::XDocHostUIHandler::ShowContextMenu(DWORD dwID, POINT * ppt, IUnknown * pcmdtReserved, IDispatch * pdispReserved) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnShowContextMenu( dwID, ppt, pcmdtReserved, pdispReserved ); } HRESULT CHtmControlSite::XDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg, const GUID * pguidCmdGroup, DWORD nCmdID) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return E_NOTIMPL; return pThis->m_pView->OnTranslateAccelerator( lpMsg, pguidCmdGroup, nCmdID ); } HRESULT CHtmControlSite::XDocHostUIHandler::GetOptionKeyPath(LPOLESTR * pchKey, DWORD dw) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnGetOptionKeyPath( pchKey, dw ); } HRESULT CHtmControlSite::XDocHostUIHandler::GetDropTarget(IDropTarget * pDropTarget, IDropTarget ** ppDropTarget) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnGetDropTarget( pDropTarget, ppDropTarget ); } HRESULT CHtmControlSite::XDocHostUIHandler::GetExternal(IDispatch ** ppDispatch) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnGetExternal( ppDispatch ); } HRESULT CHtmControlSite::XDocHostUIHandler::TranslateUrl(DWORD dwTranslate, OLECHAR * pchURLIn, OLECHAR ** ppchURLOut) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnTranslateUrl( dwTranslate, pchURLIn, ppchURLOut ); } HRESULT CHtmControlSite::XDocHostUIHandler::FilterDataObject(IDataObject * pDO, IDataObject ** ppDORet) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler); return pThis->m_pView->OnFilterDataObject( pDO, ppDORet ); } #if (_WIN32_IE >= 0x0501) // IE 5.5 and higher ULONG CHtmControlSite::XDocHostUIHandler2::AddRef() { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler2); return pThis->ExternalAddRef(); } ULONG CHtmControlSite::XDocHostUIHandler2::Release() { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler2); return pThis->ExternalRelease(); } HRESULT CHtmControlSite::XDocHostUIHandler2::QueryInterface(REFIID riid, void ** ppvObj) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler2); return pThis->ExternalQueryInterface( &riid, ppvObj ); } HRESULT CHtmControlSite::XDocHostUIHandler2::GetHostInfo(DOCHOSTUIINFO *) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::ShowUI(DWORD /*dwID*/, IOleInPlaceActiveObject * /*pActiveObject*/, IOleCommandTarget * /*pCommandTarget*/, IOleInPlaceFrame * /*pFrame*/, IOleInPlaceUIWindow * /*pDoc*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::HideUI() { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::UpdateUI() { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::EnableModeless(BOOL /*fEnable*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::OnDocWindowActivate(BOOL /*fActivate*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::OnFrameWindowActivate(BOOL /*fActivate*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::ResizeBorder(LPCRECT /*prcBorder*/, IOleInPlaceUIWindow* /*pUIWindow*/, BOOL /*fRameWindow*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::ShowContextMenu(DWORD /*dwID*/, POINT* /*pptPosition*/, IUnknown* /*pCommandTarget*/, IDispatch* /*pDispatchObjectHit*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::TranslateAccelerator(LPMSG /*lpMsg*/, const GUID * /*pguidCmdGroup*/, DWORD /*nCmdID*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::GetOptionKeyPath(BSTR* /*pbstrKey*/, DWORD) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::GetDropTarget(IDropTarget * /*pDropTarget*/, IDropTarget ** /*ppDropTarget*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::GetExternal(IDispatch ** /*ppDispatch*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::TranslateUrl(DWORD /*dwTranslate*/, OLECHAR * /*pchURLIn*/, OLECHAR ** /*ppchURLOut*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::FilterDataObject(IDataObject * /*pDO*/, IDataObject ** /*ppDORet*/) { ASSERT(FALSE); return S_FALSE; } HRESULT CHtmControlSite::XDocHostUIHandler2::GetOverrideKeyPath(LPOLESTR * pchKey, DWORD dw) { METHOD_PROLOGUE(CHtmControlSite, DocHostUIHandler2); return pThis->m_pView->OnGetOverrideKeyPath( pchKey, dw ); } #endif // InternetSecurityManager Methods HRESULT FAR EXPORT CHtmControlSite::XInternetSecurityManager ::QueryInterface(REFIID riid, void** ppvObj) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj); return hr; } ULONG FAR EXPORT CHtmControlSite::XInternetSecurityManager::AddRef() { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return pThis->ExternalAddRef(); } ULONG FAR EXPORT CHtmControlSite::XInternetSecurityManager::Release() { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return pThis->ExternalRelease(); } HRESULT CHtmControlSite::XInternetSecurityManager ::SetSecuritySite (IInternetSecurityMgrSite *pSite) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } HRESULT CHtmControlSite::XInternetSecurityManager ::GetSecuritySite(IInternetSecurityMgrSite **ppSite) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } HRESULT CHtmControlSite::XInternetSecurityManager ::MapUrlToZone(LPCWSTR pwszUrl,DWORD *pdwZone,DWORD dwFlags) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } HRESULT FAR EXPORT CHtmControlSite::XInternetSecurityManager ::GetSecurityId(LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD dwReserved) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } STDMETHODIMP CHtmControlSite::XInternetSecurityManager ::ProcessUrlAction( /* [in] */ LPCWSTR pwszUrl, /* [in] */ DWORD dwAction, /* [size_is][out] */ BYTE __RPC_FAR *pPolicy, /* [in] */ DWORD cbPolicy, /* [in] */ BYTE __RPC_FAR *pContext, /* [in] */ DWORD cbContext, /* [in] */ DWORD dwFlags, /* [in] */ DWORD dwReserved) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) DWORD dwPolicy=URLPOLICY_ALLOW; BOOL bNoActiveX=FALSE; BOOL bNoJava=FALSE; BOOL bNoScript=FALSE; BOOL bCrossData=FALSE; if (dwAction <= URLACTION_ACTIVEX_MAX && dwAction >= URLACTION_ACTIVEX_MIN) dwPolicy = bNoActiveX ? URLPOLICY_DISALLOW : URLPOLICY_ALLOW; else if ((dwAction <= URLACTION_JAVA_MAX && dwAction >= URLACTION_JAVA_MIN) || URLACTION_HTML_JAVA_RUN == dwAction) if (bNoJava) dwPolicy = URLPOLICY_JAVA_PROHIBIT; else return INET_E_DEFAULT_ACTION; else if (dwAction <= URLACTION_SCRIPT_MAX && dwAction >= URLACTION_SCRIPT_MIN) dwPolicy = bNoScript ? URLPOLICY_DISALLOW : URLPOLICY_ALLOW; // !! If the compiler can't find URLACTION_CROSS_DOMAIN_DATA, make sure you are building with // !! the latest version of the IE headers -- URLMON.H specifically -- from MSDN Downloads for the // !! Web Workshop or the Platform SDK else if (URLACTION_CROSS_DOMAIN_DATA == dwAction) dwPolicy = bCrossData ? URLPOLICY_ALLOW : URLPOLICY_DISALLOW; else return INET_E_DEFAULT_ACTION; if ( cbPolicy >= sizeof (DWORD)) { *(DWORD*) pPolicy = dwPolicy; return S_OK; } else { return S_FALSE; } } HRESULT CHtmControlSite::XInternetSecurityManager ::QueryCustomPolicy(LPCWSTR pwszUrl, REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } HRESULT CHtmControlSite::XInternetSecurityManager ::SetZoneMapping(DWORD dwZone, LPCWSTR lpszPattern, DWORD dwFlags) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } HRESULT CHtmControlSite::XInternetSecurityManager ::GetZoneMappings(DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags) { METHOD_PROLOGUE(CHtmControlSite, InternetSecurityManager) return INET_E_DEFAULT_ACTION; } // ServiceProvider Methods ULONG FAR EXPORT CHtmControlSite::XServiceProvider::AddRef() { METHOD_PROLOGUE(CHtmControlSite, ServiceProvider) return pThis->ExternalAddRef(); } ULONG FAR EXPORT CHtmControlSite::XServiceProvider::Release() { METHOD_PROLOGUE(CHtmControlSite, ServiceProvider) return pThis->ExternalRelease(); } HRESULT FAR EXPORT CHtmControlSite::XServiceProvider ::QueryInterface(REFIID riid, void** ppvObj) { METHOD_PROLOGUE(CHtmControlSite, ServiceProvider) HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj); return hr; } STDMETHODIMP CHtmControlSite::XServiceProvider ::QueryService(REFGUID guidService, REFIID riid, void** ppvObject) { if (guidService == SID_SInternetSecurityManager && riid == IID_IInternetSecurityManager) { METHOD_PROLOGUE(CHtmControlSite, ServiceProvider) HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObject); return hr; } else { *ppvObject = NULL; } return E_NOINTERFACE; } / STDMETHODIMP_(ULONG) CHtmControlSite::XMyAmbientProps::AddRef() { METHOD_PROLOGUE_EX_(CHtmControlSite, MyAmbientProps) return (ULONG)pThis->InternalAddRef(); } STDMETHODIMP_(ULONG) CHtmControlSite::XMyAmbientProps::Release() { METHOD_PROLOGUE_EX_(CHtmControlSite, MyAmbientProps) return (ULONG)pThis->InternalRelease(); } STDMETHODIMP CHtmControlSite::XMyAmbientProps::QueryInterface( REFIID iid, LPVOID* ppvObj) { METHOD_PROLOGUE_EX_(CHtmControlSite, MyAmbientProps) return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj); } STDMETHODIMP CHtmControlSite::XMyAmbientProps::GetTypeInfoCount( unsigned int*) { return E_NOTIMPL; } STDMETHODIMP CHtmControlSite::XMyAmbientProps::GetTypeInfo( unsigned int, LCID, ITypeInfo**) { return E_NOTIMPL; } STDMETHODIMP CHtmControlSite::XMyAmbientProps::GetIDsOfNames( REFIID, LPOLESTR*, unsigned int, LCID, DISPID*) { return E_NOTIMPL; } STDMETHODIMP CHtmControlSite::XMyAmbientProps::Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr) { HRESULT hr; METHOD_PROLOGUE_EX_(CHtmControlSite, MyAmbientProps) hr = pThis->m_xAmbientProps.Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); return hr; switch (dispidMember) { case DISPID_AMBIENT_DLCONTROL: TRACE("XMyAmbientProps::Invoke: DISPID_AMBIENT_DLCONTROL/n"); { pvarResult->vt = VT_I4; // pvarResult->lVal = DLCTL_NO_DLACTIVEXCTLS | (DLCTL_DOWNLOADONLY & ~(DLCTL_DLIMAGES | DLCTL_VIDEOS | DLCTL_BGSOUNDS)); pvarResult->lVal = DLCTL_DLIMAGES | DLCTL_NO_SCRIPTS; // 屏蔽脚本 hr = S_OK; } break; default: TRACE("XMyAmbientProps::Invoke: %d/n", dispidMember); } return hr; }