您的位置:首页 > 其它

关于自定义webbroswer,禁止弹出文件下载窗口的方法

2009-12-14 13:25 519 查看
前段时间我在逛CSDN的时候,看见有些人提出上述问题,而回复总是不甚理想,我本是是一个潜水者,但是不希望让更多的人为这个问题而纠结,我把实现的方法给需要帮助的人说说吧。

其实说来很简单,其实就是自己实现webbrowser的IDownloadManager接口中的Download函数即可,具体如何操作请按下面几步实现:

1 在google搜索下ie55_lib.exe,运行之,便可在得到我们需要的接口定义的头文件:downloadmgr.h。

2 将该头文件添加进自己的工程,然后在引用webbroswer的窗口类中集成里面的IDownloadManager和IServiceProvider接口。其中窗口类可以使CWnd或者CDialog,例子如:

class CMyBrowserWnd :
, public IDownloadManager

{

};

3 然后重载QueryInterface方法,即让系统查询接口时调用我们重载的方法进行查询。具体代码可参考:

HRESULT CBrowserWnd::QueryInterface(REFIID riid, void **ppv)
{
if (IsEqualIID(riid,IID_IServiceProvider))
{
*ppv = static_cast<IServiceProvider*>(this);
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}

4 接着重载QueryService方法,即但webbroswer加载服务的时候,先来我们重载的QueryService方法查询,让webbroswer加载我们定制的下载管理服务接口即可,代码可参考:

HRESULT CBrowserWnd::QueryService( REFGUID guidService,REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject)
{

if(guidService == SID_SDownloadManager && riid == IID_IDownloadManager)
{
*ppvObject = static_cast<IDownloadManager*>(this);
return S_OK;
}
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}
}

5 重载IDownloadManager的Download的方法,具体实现如下:

STDMETHODIMP Download(IMoniker* pmk,
IBindCtx* pbc,
DWORD dwBindVerb,
LONG grfBINDF,
BINDINFO* pBindInfo,
LPCOLESTR pszHeaders,
LPCOLESTR pszRedir,
UINT uiCP )
{
return S_OK;
}

本处为方便所以简单的返回S_OK,如需要具体实现,请自行实现,但是这样也即可屏蔽下载窗口,即默认为不下载。

本篇只是为大家示范该如何实现此需要,其间具体的机制和原理,请参看MSDN,本人就不多说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐