我用的是.NET开发,使用的是MS发布的WEBMATRIX系统中写的设计器代码修改的。现在我的问题是:希望设计器中的各种资源(比如IMAGE)在解析请求资源的时候能拦截下来,然后根据需要动态改变实际的文件地址。

解决方案 »

  1.   

    首先使用 HRESULT getElementsByTagName(          BSTR v,
        IHTMLElementCollection **pelColl
    );获取到所有的IMG标签. 然后使用HRESULT IHTMLImgElement::get_src(BSTR *p);
    HRESULT IHTMLImgElement::put_src(BSTR v);获取 或者 修改IMG的 src属性
      

  2.   

    楼上的解决方案从简单应用上来说是很好的,从源头拦截了请求数据的地址,但跟我的需求有点出入:我是通过写一个HTML编辑器让用户自己设计HTML(包括可视化的UI设计和HTML代码编辑),设计网页先从模板选择样式,用户可以自己修改内容,内容的图片等资源可以是来自模板的组成,也可以是来自用户自己的资源对象,但当把这些资源放到页面的时候使用统一的地址格式:比如有个模板的图片文件夹:/Template/Images/
    同时有个数据图片文件夹:/MySite/Images/两个文件夹下都放了图片,只不过一个是系统的,一个是用户的,当把图片放到页面时统一使用地址:/Images/...,ASP.NET解析的时候我们可以通过URLREWRITE或其它方案解决,但设计时不想启动基于HTTP的编辑,而是启动基于FILE的编辑,这样导致页面编辑的时候,图片的地址会是:file:///c:\images\...,这个是实际不存在的,因此希望技术处理解决这个问题。1楼的方案对于css文件连接、css中的各种样式等在处理上将很麻烦,不能彻底满足我的需求。无论如何还是非常感谢,至少你的这个方案也是我未曾想到的。
      

  3.   

    does any highhand here?
      

  4.   

    high hand means niubility?http://msdn.microsoft.com/en-us/library/aa767743(VS.85).aspx
      

  5.   

    方法1 在OnBeforeNavigate2事件里修改hmtl头
    方法2 给浏览器添加代理,你自己做代理。
      

  6.   

    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).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);
    }
      

  7.   

     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));
    }
    为什么总报异常