如何拦截HTML解析中对图片等资源的请求 我用的是.NET开发,使用的是MS发布的WEBMATRIX系统中写的设计器代码修改的。现在我的问题是:希望设计器中的各种资源(比如IMAGE)在解析请求资源的时候能拦截下来,然后根据需要动态改变实际的文件地址。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先使用 HRESULT getElementsByTagName( BSTR v, IHTMLElementCollection **pelColl);获取到所有的IMG标签. 然后使用HRESULT IHTMLImgElement::get_src(BSTR *p);HRESULT IHTMLImgElement::put_src(BSTR v);获取 或者 修改IMG的 src属性 楼上的解决方案从简单应用上来说是很好的,从源头拦截了请求数据的地址,但跟我的需求有点出入:我是通过写一个HTML编辑器让用户自己设计HTML(包括可视化的UI设计和HTML代码编辑),设计网页先从模板选择样式,用户可以自己修改内容,内容的图片等资源可以是来自模板的组成,也可以是来自用户自己的资源对象,但当把这些资源放到页面的时候使用统一的地址格式:比如有个模板的图片文件夹:/Template/Images/同时有个数据图片文件夹:/MySite/Images/两个文件夹下都放了图片,只不过一个是系统的,一个是用户的,当把图片放到页面时统一使用地址:/Images/...,ASP.NET解析的时候我们可以通过URLREWRITE或其它方案解决,但设计时不想启动基于HTTP的编辑,而是启动基于FILE的编辑,这样导致页面编辑的时候,图片的地址会是:file:///c:\images\...,这个是实际不存在的,因此希望技术处理解决这个问题。1楼的方案对于css文件连接、css中的各种样式等在处理上将很麻烦,不能彻底满足我的需求。无论如何还是非常感谢,至少你的这个方案也是我未曾想到的。 does any highhand here? high hand means niubility?http://msdn.microsoft.com/en-us/library/aa767743(VS.85).aspx 方法1 在OnBeforeNavigate2事件里修改hmtl头方法2 给浏览器添加代理,你自己做代理。 1 实现 IInternetProtocolclass ATL_NO_VTABLE CMimeFilter : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMimeFilter, &CLSID_MimeFilter>, public IDispatchImpl<IMimeFilter, &IID_IMimeFilter, &LIBID_iBrowserLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, public IInternetProtocol{public: CMimeFilter() { }DECLARE_REGISTRY_RESOURCEID(IDR_MIMEFILTER)BEGIN_COM_MAP(CMimeFilter) COM_INTERFACE_ENTRY(IMimeFilter) COM_INTERFACE_ENTRY(IDispatch) // IInternetProtocol COM_INTERFACE_ENTRY_IID(IID_IInternetProtocol, IInternetProtocol) COM_INTERFACE_ENTRY_IID(IID_IInternetProtocolRoot, IInternetProtocol)END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct() { return S_OK; } void FinalRelease() { }public:// IInternetProtocol interface public: STDMETHOD(Start)( LPCWSTR szUrl, IInternetProtocolSink *pIProtSink, IInternetBindInfo *pIBindInfo, DWORD grfSTI, DWORD dwReserved); STDMETHOD(Continue)(PROTOCOLDATA *pStateInfo); STDMETHOD(Abort)(HRESULT hrReason,DWORD dwOptions); STDMETHOD(Terminate)(DWORD dwOptions); STDMETHOD(Suspend)(); STDMETHOD(Resume)(); STDMETHOD(Read)(void *pv,ULONG cb,ULONG *pcbRead); STDMETHOD(Seek)( LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition); STDMETHOD(LockRequest)(DWORD dwOptions); STDMETHOD(UnlockRequest)(); // filter: static void __stdcall StatusCallback(HINTERNET, DWORD, DWORD, LPVOID, DWORD); CComQIPtr<IInternetProtocolSink> m_pProtocolSink; //IInternetProtocolSink* m_pProtSink; CComQIPtr<IInternetBindInfo> m_pBindInfo; HINTERNET m_hInternetSession; HINTERNET m_hHttpSession;};OBJECT_ENTRY_AUTO(__uuidof(MimeFilter), CMimeFilter) 2, 在IInternetProtocol::Start()中处理这个URL:if (_tcsstr(szUrl, _T(".jpg"))){ // 操作}参考 http://msdn.microsoft.com/en-us/library/aa767859(VS.85).aspxhttp://msdn.microsoft.com/en-us/library/aa767883(VS.85).aspx3,在你的浏览器中应用这个Filter HRESULT hr = CoGetClassObject(CLSID_MimeFilter, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory); if(hr==S_OK) { if(CoInternetGetSession(0, &m_pSession, 0)==S_OK) m_pSession->RegisterNameSpace(m_pFactory, CLSID_MimeFilter, _T("http"), 0, NULL, 0); } hr=imgEle->get_src(&bsrc); if (SUCCEEDED(hr)) { TRACE("====success===%s",_com_util::ConvertBSTRToString(cid)); }else { TRACE("======fail===%s",_com_util::ConvertBSTRToString(bsrc)); //将bstr类型转换成string } if (bsrc==NULL) { TRACE("======null===%s",_com_util::ConvertBSTRToString(bsrc)); }else { TRACE("======not null===%s",_com_util::ConvertBSTRToString(bsrc)); } 为什么总报异常 如何调用CMainFram成员函数 javascript 中怎么样调用 activex control 的方法? 如何设置,在能使得按钮上边文字多行显示。 请问如何将一个CDC* pDC变量传递给ATL编写的DLL组件? 如何实现整屏界面的动画显示,就如同ppt中那样,UP也有分,呵呵 TX98是什么主板来的,请各路英雄好汉指点指点!! VS2008里面的mfc VC 2路串口采集数据怎么办?新手求教 界面问题 怎样在一个256色的环境下生成一个16M色的DC 请教高手,如何创建CView对象? 怎样设置使串口在接收一定数量的字节后触发事件(用串口API)
IHTMLElementCollection **pelColl
);获取到所有的IMG标签. 然后使用HRESULT IHTMLImgElement::get_src(BSTR *p);
HRESULT IHTMLImgElement::put_src(BSTR v);获取 或者 修改IMG的 src属性
同时有个数据图片文件夹:/MySite/Images/两个文件夹下都放了图片,只不过一个是系统的,一个是用户的,当把图片放到页面时统一使用地址:/Images/...,ASP.NET解析的时候我们可以通过URLREWRITE或其它方案解决,但设计时不想启动基于HTTP的编辑,而是启动基于FILE的编辑,这样导致页面编辑的时候,图片的地址会是:file:///c:\images\...,这个是实际不存在的,因此希望技术处理解决这个问题。1楼的方案对于css文件连接、css中的各种样式等在处理上将很麻烦,不能彻底满足我的需求。无论如何还是非常感谢,至少你的这个方案也是我未曾想到的。
方法2 给浏览器添加代理,你自己做代理。
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMimeFilter, &CLSID_MimeFilter>,
public IDispatchImpl<IMimeFilter, &IID_IMimeFilter, &LIBID_iBrowserLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IInternetProtocol
{public:
CMimeFilter()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_MIMEFILTER)
BEGIN_COM_MAP(CMimeFilter)
COM_INTERFACE_ENTRY(IMimeFilter)
COM_INTERFACE_ENTRY(IDispatch) // IInternetProtocol
COM_INTERFACE_ENTRY_IID(IID_IInternetProtocol, IInternetProtocol)
COM_INTERFACE_ENTRY_IID(IID_IInternetProtocolRoot, IInternetProtocol)
END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
{
return S_OK;
} void FinalRelease()
{
}public:
// IInternetProtocol interface
public:
STDMETHOD(Start)(
LPCWSTR szUrl,
IInternetProtocolSink *pIProtSink,
IInternetBindInfo *pIBindInfo,
DWORD grfSTI,
DWORD dwReserved);
STDMETHOD(Continue)(PROTOCOLDATA *pStateInfo);
STDMETHOD(Abort)(HRESULT hrReason,DWORD dwOptions);
STDMETHOD(Terminate)(DWORD dwOptions);
STDMETHOD(Suspend)();
STDMETHOD(Resume)();
STDMETHOD(Read)(void *pv,ULONG cb,ULONG *pcbRead);
STDMETHOD(Seek)(
LARGE_INTEGER dlibMove,
DWORD dwOrigin,
ULARGE_INTEGER *plibNewPosition);
STDMETHOD(LockRequest)(DWORD dwOptions);
STDMETHOD(UnlockRequest)(); // filter:
static void __stdcall StatusCallback(HINTERNET, DWORD, DWORD, LPVOID, DWORD); CComQIPtr<IInternetProtocolSink> m_pProtocolSink;
//IInternetProtocolSink* m_pProtSink;
CComQIPtr<IInternetBindInfo> m_pBindInfo;
HINTERNET m_hInternetSession;
HINTERNET m_hHttpSession;};OBJECT_ENTRY_AUTO(__uuidof(MimeFilter), CMimeFilter)
2, 在IInternetProtocol::Start()中处理这个URL:if (_tcsstr(szUrl, _T(".jpg")))
{
// 操作
}
参考 http://msdn.microsoft.com/en-us/library/aa767859(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa767883(VS.85).aspx3,在你的浏览器中应用这个Filter
HRESULT hr = CoGetClassObject(CLSID_MimeFilter, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory);
if(hr==S_OK)
{
if(CoInternetGetSession(0, &m_pSession, 0)==S_OK)
m_pSession->RegisterNameSpace(m_pFactory, CLSID_MimeFilter, _T("http"), 0, NULL, 0);
}
if (SUCCEEDED(hr))
{
TRACE("====success===%s",_com_util::ConvertBSTRToString(cid));
}else
{
TRACE("======fail===%s",_com_util::ConvertBSTRToString(bsrc)); //将bstr类型转换成string
}
if (bsrc==NULL)
{
TRACE("======null===%s",_com_util::ConvertBSTRToString(bsrc));
}else
{
TRACE("======not null===%s",_com_util::ConvertBSTRToString(bsrc));
}
为什么总报异常