如何拦截HTML解析中对图片等资源的请求

daview 2009-03-09 08:13:07
我用的是.NET开发,使用的是MS发布的WEBMATRIX系统中写的设计器代码修改的。

现在我的问题是:

希望设计器中的各种资源(比如IMAGE)在解析请求资源的时候能拦截下来,然后根据需要动态改变实际的文件地址。
...全文
337 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xueli_jingtian 2011-05-13
  • 打赏
  • 举报
回复
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));
}
为什么总报异常
Ceja 2009-03-25
  • 打赏
  • 举报
回复
1 实现 IInternetProtocol

class 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).aspx
http://msdn.microsoft.com/en-us/library/aa767883(VS.85).aspx

3,在你的浏览器中应用这个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);
}
liweiwei0808 2009-03-22
  • 打赏
  • 举报
回复
方法1 在OnBeforeNavigate2事件里修改hmtl头
方法2 给浏览器添加代理,你自己做代理。
eduyu 2009-03-21
  • 打赏
  • 举报
回复
high hand means niubility?

http://msdn.microsoft.com/en-us/library/aa767743(VS.85).aspx
daview 2009-03-17
  • 打赏
  • 举报
回复
does any highhand here?
scems 2009-03-13
  • 打赏
  • 举报
回复
ding
daview 2009-03-13
  • 打赏
  • 举报
回复
楼上的解决方案从简单应用上来说是很好的,从源头拦截了请求数据的地址,但跟我的需求有点出入:

我是通过写一个HTML编辑器让用户自己设计HTML(包括可视化的UI设计和HTML代码编辑),设计网页先从模板选择样式,用户可以自己修改内容,内容的图片等资源可以是来自模板的组成,也可以是来自用户自己的资源对象,但当把这些资源放到页面的时候使用统一的地址格式:

比如有个模板的图片文件夹:/Template/Images/
同时有个数据图片文件夹:/MySite/Images/

两个文件夹下都放了图片,只不过一个是系统的,一个是用户的,当把图片放到页面时统一使用地址:/Images/...,ASP.NET解析的时候我们可以通过URLREWRITE或其它方案解决,但设计时不想启动基于HTTP的编辑,而是启动基于FILE的编辑,这样导致页面编辑的时候,图片的地址会是:file:///c:\images\...,这个是实际不存在的,因此希望技术处理解决这个问题。

1楼的方案对于css文件连接、css中的各种样式等在处理上将很麻烦,不能彻底满足我的需求。无论如何还是非常感谢,至少你的这个方案也是我未曾想到的。
CodeProject-Jerry 2009-03-10
  • 打赏
  • 举报
回复
首先使用

HRESULT getElementsByTagName( BSTR v,
IHTMLElementCollection **pelColl
);

获取到所有的IMG标签.

然后使用

HRESULT IHTMLImgElement::get_src(BSTR *p);
HRESULT IHTMLImgElement::put_src(BSTR v);

获取 或者 修改IMG的 src属性

3,055

社区成员

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

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