求助,IE控件屏蔽几乎一切弹框,但会出现引用出错等错误,屏蔽弹框效果有.

不说害怕 2008-10-20 10:02:42
IE控件屏蔽几乎一切弹框,但会出现引用出错等错误,屏蔽弹框效果有.求助
vc6, MFC 对话框程序.
代码比较长,就一个对话框程序,插入了一个IE控件,一个按钮,点击按钮就访问一个固定的网页.
问题是.
我加了这段代码,图片就屏蔽不了,屏蔽弹框可以,程序退出会出错.引用计数不对断言.

请专家 帮忙.


// testWebDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testWeb.h"
#include "testWebDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include <docobj.h>
#include <MSHTMDID.h>
#include <atlbase.h>
extern CComModule _Module; //for atlbase.h
#include <atlcom.h> //for OLE2T
#include <mshtmhst.h>
#include <afxole.h>

//------------------------------------------------
class CMyOleClientSite : public IOleClientSite , public IOleCommandTarget , public IDocHostShowUI, public IDocHostUIHandler , public IDispatch
{
public:
CComQIPtr<IOleCommandTarget> m_spDefaultOleCommandTarget;
CComQIPtr<IDocHostUIHandler> m_spDefaultDocHostUIHandler;
CComQIPtr<IDocHostShowUI> m_spDefaultIDocHostShowUI;
//{{ IDispatch
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo)
{
// TRACE(_T("IDispatch::GetTypeInfoCount"));
*pctinfo=0;
return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo)
{
// TRACE(_T("IDispatch::GetTypeInfo"));
*ppTInfo=NULL; return E_NOTIMPL;
}
STDMETHOD(GetIDsOfNames)(REFIID riid,OLECHAR **rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId)
{
// TRACE(_T("IDispatch::GetIDsOfNames"));
return E_NOTIMPL;
}
STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams,
VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{
TRACE(_T("IDispatch::Invoke DISPID_AMBIENT_DLCONTROL"));
switch (dispidMember)
{
case DISPID_AMBIENT_DLCONTROL:
{
pvarResult->vt = VT_I4;
pvarResult->lVal = DLCTL_NO_DLACTIVEXCTLS | (DLCTL_DOWNLOADONLY & ~(DLCTL_DLIMAGES | DLCTL_VIDEOS | DLCTL_BGSOUNDS));
}
break;
default: return DISP_E_MEMBERNOTFOUND;
}
return S_OK;
}
//}} end IDispatch
//{{ IDochostUIHandler
STDMETHOD(ShowContextMenu)(DWORD dwID, POINT FAR* ppt, IUnknown FAR* pcmdTarget, IDispatch FAR* pdispReserved)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->ShowContextMenu(dwID, ppt, pcmdTarget, pdispReserved);

return S_FALSE;
}
STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject FAR* pActiveObject, IOleCommandTarget FAR* pCommandTarget,
IOleInPlaceFrame FAR* pFrame, IOleInPlaceUIWindow FAR* pDoc)
{
//printf("ShowUI!\n");
//return S_OK;

if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->ShowUI(dwID, pActiveObject, pCommandTarget, pFrame, pDoc);

return S_FALSE;
}
STDMETHOD(GetHostInfo)(DOCHOSTUIINFO FAR *pInfo)
{
if (pInfo != NULL)
{
pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER;
}
return S_OK;
//E_NOTIMPL;
//pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER;
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->GetHostInfo(pInfo);

return S_OK;
}
STDMETHOD(HideUI)(void)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->HideUI();

return S_OK;
}
STDMETHOD(UpdateUI)(void)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->UpdateUI();

return S_OK;
}
STDMETHOD(EnableModeless)(BOOL fEnable)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->EnableModeless(fEnable);

return S_OK;
}
STDMETHOD(OnDocWindowActivate)(BOOL fActivate)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->OnDocWindowActivate(fActivate);

return S_OK;
}
STDMETHOD(OnFrameWindowActivate)(BOOL fActivate)
{
if
(m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->OnFrameWindowActivate(fActivate);

return S_OK;
}
STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow FAR* pUIWindow, BOOL fFrameWindow)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->ResizeBorder(prcBorder, pUIWindow, fFrameWindow);

return S_OK;
}
STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID FAR* pguidCmdGroup, DWORD nCmdID)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->TranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID);
return E_NOTIMPL;
}
STDMETHOD(GetOverrideKeyPath)(LPOLESTR FAR* pchKey, DWORD dw)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->GetOptionKeyPath(pchKey, dw);
return E_FAIL;
}
STDMETHOD(GetOptionKeyPath)(LPOLESTR FAR* pchKey, DWORD dw)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->GetOptionKeyPath(pchKey, dw);
return E_FAIL;
}
STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget** ppDropTarget)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->GetDropTarget(pDropTarget, ppDropTarget);

return S_OK;
}
STDMETHOD(GetExternal)(IDispatch** ppDispatch)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->GetExternal(ppDispatch);
return S_FALSE; }
STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->TranslateUrl(dwTranslate, pchURLIn, ppchURLOut);
return S_FALSE; }
STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet)
{
if (m_spDefaultDocHostUIHandler)
return m_spDefaultDocHostUIHandler->FilterDataObject(pDO, ppDORet);
return S_FALSE;
}
//}} end IDochostUIHandler
//{{ IDocHostShowUI
STDMETHOD(ShowHelp)(HWND hwnd,LPOLESTR pszHelpFile,UINT uCommand,DWORD dwData,
POINT ptMouse,IDispatch *pDispatchObjectHit)
{
printf("ShowHelp!\n");
return S_OK;
if (m_spDefaultIDocHostShowUI)
return m_spDefaultIDocHostShowUI->ShowHelp(hwnd,pszHelpFile,uCommand,dwData,ptMouse,pDispatchObjectHit);

return S_FALSE;
}
STDMETHOD(ShowMessage)(HWND hwnd,LPOLESTR lpstrText,LPOLESTR lpstrCaption,DWORD dwType,
LPOLESTR lpstrHelpFile,DWORD dwHelpContext,LRESULT *plResult)
{
printf("ShowMessage!\n");
return S_OK;

if (m_spDefaultIDocHostShowUI)
return m_spDefaultIDocHostShowUI->ShowMessage(hwnd,lpstrText,lpstrCaption,dwType,lpstrHelpFile,dwHelpContext,plResult);

return S_FALSE;
}
//}} end IDocHostShowUI
//{{ for IOleClientSite
STDMETHODIMP SaveObject()
{
return E_NOTIMPL;
}
STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk)
{
return E_NOTIMPL;
}
STDMETHODIMP OnShowWindow(BOOL fShow)
{
return E_NOTIMPL;
}
STDMETHODIMP RequestNewObjectLayout()
{
return E_NOTIMPL;
}
STDMETHODIMP GetContainer(LPOLECONTAINER FAR* ppContainer)
{
return E_NOTIMPL;
}
STDMETHODIMP ShowObject()
{
return S_OK;
}
//}} end IOleClientSite
...全文
452 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gjlstc 2008-10-21
  • 打赏
  • 举报
回复
up
不说害怕 2008-10-21
  • 打赏
  • 举报
回复
修改成下面这样,能去掉错误.好像.

但问题是,还是不能屏蔽图片等(控制网页元素的下载).


//----------------------------------------
// 屏蔽大部分弹框
HRESULT hr;
IWebBrowser2 *m_pBrowser;
IUnknown *pUnknown=m_myie.GetControlUnknown();
hr = pUnknown->QueryInterface(&m_pBrowser);
if (SUCCEEDED(hr))
{
CComPtr<IOleObject> spOleObj;
hr = m_pBrowser->QueryInterface(IID_IOleObject, (void**)&spOleObj);
if (SUCCEEDED(hr))
{
spOleObj->GetClientSite(&pIOleClientSite);
pIOleClientSite->Release();
pIOleClientSite = NULL;
//设置用户站点
spOleObj->SetClientSite(&myOleClientSite);
}
}
m_pBrowser->Release();
m_pBrowser = NULL;
pUnknown = NULL;
//----------------------------------------
不说害怕 2008-10-21
  • 打赏
  • 举报
回复
去掉下面代码的注释就解决了这个问题了.哎.晕死我了.


else if (riid == IID_IDispatch)
{
printf("IID_IDispatch!\n");
*ppvObject = (void**)static_cast<IDispatch*>(this);
return S_OK;
}


---------------------------------
另外可能客户站点改回原来更好.


BOOL CXXXDlg::OnInitDialog() 下

//----------------------------------------
// 屏蔽大部分弹框
HRESULT hr;
IWebBrowser2 *m_pBrowser;
IUnknown *pUnknown=m_myie.GetControlUnknown();
hr = pUnknown->QueryInterface(&m_pBrowser);
if (SUCCEEDED(hr))
{
CComPtr<IOleObject> spOleObj;
hr = m_pBrowser->QueryInterface(IID_IOleObject, (void**)&spOleObj);
if (SUCCEEDED(hr))
{
spOleObj->GetClientSite(&pIOleClientSite);
pIOleClientSite->Release();
//设置用户站点
spOleObj->SetClientSite(&myOleClientSite);
}
}
m_pBrowser->Release();
m_pBrowser = NULL;
pUnknown = NULL;
//----------------------------------------


void CXXXDlg::OnDestroy()
{
TRACE("OnDestroy\r\n");
//----------------------------------------
HRESULT hr;
IWebBrowser2 *m_pBrowser;
IUnknown *pUnknown=m_myie.GetControlUnknown();
hr = pUnknown->QueryInterface(&m_pBrowser);
if (SUCCEEDED(hr))
{
CComPtr<IOleObject> spOleObj; //CComPtr<IOleObject>
hr = m_pBrowser->QueryInterface(IID_IOleObject, (void**)&spOleObj);
if (SUCCEEDED(hr))
{
//设置默认站点
spOleObj->SetClientSite(pIOleClientSite);
pIOleClientSite = NULL;
}
}
m_pBrowser->Release();
m_pBrowser = NULL;
pUnknown = NULL;
//----------------------------------------
CDialog::OnDestroy();
}

不说害怕 2008-10-20
  • 打赏
  • 举报
回复

/////////////////////////////////////////////////////////////////////////////
// CTestWebDlg message handlers
CMyOleClientSite myOleClientSite;
IOleClientSite* pIOleClientSite;
LPDISPATCH m_lpDisp;//用于判断网页加载是否真正完毕
BOOL CTestWebDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
m_lpDisp = NULL;

//----------------------------------------
// 屏蔽大部分弹框
HRESULT hr;
IWebBrowser2 *m_pBrowser;
IUnknown *pUnknown=m_myie.GetControlUnknown();
hr = pUnknown->QueryInterface(&m_pBrowser);
if (SUCCEEDED(hr))
{
CComPtr<IOleObject> spOleObj;
hr = m_pBrowser->QueryInterface(IID_IOleObject, (void**)&spOleObj);
if (SUCCEEDED(hr))
{
spOleObj->GetClientSite(&pIOleClientSite);
//设置用户站点
spOleObj->SetClientSite(&myOleClientSite);
//spOleObj->SetClientSite(pIOleClientSite);
}
}
m_pBrowser->Release();
m_pBrowser = NULL;
pUnknown->Release();
pUnknown = NULL;
//----------------------------------------
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestWebDlg::OnButton1()
{
m_myie.Navigate2( &CComVariant("http://zhidao.baidu.com/"),&CComVariant(""),&CComVariant(""),&CComVariant(""),&CComVariant(""));
}

BOOL CTestWebDlg::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
{
// 不下载图片, 视频, 声音, ActiveX控件, 图片即使下载, 只下载不显示
if (dispid == DISPID_AMBIENT_DLCONTROL)
{
pvar->vt = VT_I4;
pvar->lVal = DLCTL_NO_DLACTIVEXCTLS | (DLCTL_DOWNLOADONLY & ~(DLCTL_DLIMAGES | DLCTL_VIDEOS | DLCTL_BGSOUNDS));
return TRUE;
}
TRACE("OnAmbientProperty\r\n");
return CDialog::OnAmbientProperty(pSite, dispid, pvar);
}

void CTestWebDlg::OnNewWindow2Explorer1(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel)
{
*Cancel = TRUE;
TRACE("OnNewWindow2\r\n");
}

void CTestWebDlg::OnNewWindow3Explorer1(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel, DWORD dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
{
*Cancel = TRUE;
}

void CTestWebDlg::OnNavigateErrorExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Frame, VARIANT FAR* StatusCode, BOOL FAR* Cancel)
{
*Cancel = TRUE;
try
{
m_myie.Navigate("about:blank",NULL,NULL,NULL,NULL);
}
catch (...)
{
TRACE("TESTURL ERR: OnNavigateErrorExplorer1\r\n");
::PostMessage(GetSafeHwnd(),WM_CLOSE,NULL,NULL);
}
}

void CTestWebDlg::OnFileDownloadExplorer1(BOOL FAR* Cancel)
{
*Cancel = TRUE;
TRACE("OnFileDownload\r\n");
}

void CTestWebDlg::OnNavigateComplete2Explorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
{
if(!m_lpDisp)
{
m_lpDisp=pDisp; // 主页面对象
TRACE("OnNavigateComplete2\r\n");
}
}

void CTestWebDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
{
if(m_lpDisp &&(m_lpDisp == pDisp)) // 判断网页是否真正加载完毕,用于多Frame网页,主文档在其他Frame下载完后才触发下载完成事件
{
//if the LPDISPATCH are same,that means it is the final DocumentComplete
m_lpDisp=NULL;//Reset glpDisp

// USES_CONVERSION;
// CString strURL = OLE2T(V_BSTR(URL));
TRACE("OnDocumentComplete\r\n");
}
}

void CTestWebDlg::OnWindowClosingExplorer1(BOOL IsChildWindow, BOOL FAR* Cancel)
{
*Cancel = TRUE;
TRACE("OnWindowClosing\r\n");
}
不说害怕 2008-10-20
  • 打赏
  • 举报
回复

//{{ for IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject)
{
if (riid == IID_IUnknown)
{
//printf("IID_IUnknown!\n");
*ppvObject = (void**)static_cast<IUnknown*>(static_cast<IDispatch*>(this));
return S_OK;
}
else if (riid == IID_IDocHostUIHandler)
{
//printf("IID_IDocHostUIHandler!\n");
*ppvObject = (void**)static_cast<IDocHostUIHandler*>(this);
return S_OK;
}
else if (riid == IID_IOleCommandTarget)
{
//printf("IID_IOleCommandTarget!\n");
*ppvObject = (void**)static_cast<IOleCommandTarget*>(this);
return S_OK;
}
else if (riid == IID_IDocHostShowUI)
{
//printf("IID_IDocHostShowUI!\n");
*ppvObject = (void**)static_cast<IDocHostShowUI*>(this);
return S_OK;
}
/*
else if (riid == IID_IDispatch)
{
*ppvObject = (void**)static_cast<IDispatch*>(this);
return S_OK;
}
*/
else if (riid == IID_IOleClientSite)
{
//printf("IID_IOleClientSite!\n");
*ppvObject = (void**)static_cast<IOleClientSite*>(this);
return S_OK;
}
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(void)
{
return 0;
}
ULONG STDMETHODCALLTYPE Release(void)
{
return 0;
}
//}} end IUnknown
//{{ for IOleCommandTarget
HRESULT STDMETHODCALLTYPE QueryStatus( const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
{
// return m_spDefaultOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
return TRUE;
}
HRESULT STDMETHODCALLTYPE Exec( const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
{
if (nCmdID == OLECMDID_SHOWSCRIPTERROR)
{
printf("OLECMDID_SHOWSCRIPTERROR!\n");
// Don't show the error dialog, but
// continue running scripts on the page. (*pvaOut).vt = VT_BOOL; (*pvaOut).boolVal = VARIANT_TRUE;
return S_OK;
}
if (nCmdID == OLECMDID_SHOWMESSAGE)
{
printf("OLECMDID_SHOWMESSAGE!\n");
// Don't show the error dialog, but
// continue running scripts on the page. (*pvaOut).vt = VT_BOOL; (*pvaOut).boolVal = VARIANT_TRUE;
return S_OK;
}
if (nCmdID == OLECMDID_SHOWFIND)
{
return S_OK;
}
if (nCmdID == OLECMDID_SHOWPAGESETUP)
{
return S_OK;
}
if (nCmdID == OLECMDID_SHOWPRINT)
{
return S_OK;
}
// return m_spDefaultOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut);
return TRUE;
}
//}} end IOleCommandTarget
};
//------------------------------------------------
gjlstc 2008-10-20
  • 打赏
  • 举报
回复
UP
不说害怕 2008-10-20
  • 打赏
  • 举报
回复
发现,
pUnknown->Release(); 这句错误.

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧