zoukankan      html  css  js  c++  java
  • 动态更改WebBrowser数据流内容

    动态更改WebBrowser数据流内容

     

        有时,由于软件的特殊需要,我们希望DELPHI在WebBrowser或embeddedwb里动态更改返回的数据内容,而这需要返回网页的所有原始源码,包括网页开始的DOCTYPE html PUBLIC声明部分,仅仅使用mshtml是无法实现的,需要用到数据流的方法。     具体执行方法如下(需要 uses mshtml,activex): procedure TForm1.Button1Click(Sender: TObject);
    var
    s:string;
    ms: TMemoryStream;
    StrStream:TStringStream;
    begin
      //先读取到流中,暂存于memo1
      if not Assigned(embeddedwb1.Document) then Exit;
      ms := TMemoryStream.Create;
      (embeddedwb1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(ms), True);
      ms.Position := 0;
      Memo1.Lines.LoadFromStream(ms);
      ms.Free;   //再从流中取出数据输出
      s := memo1.text;
      //执行替换部分代码
      s:=StringReplace(s,'_blank','_self',[rfReplaceAll,rfIgnoreCase]);
      StrStream:=TStringStream.Create(s);
      try
         StrStream.Position:=0;
         (embeddedwb1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));
      finally
         StrStream.Free;
      end;        
    end;      通过以上转换,可以实现无损式的动态修改网页源码,保证css格式。      但存在一个问题,比如原始的网页的uri为 http://www.piaoyi.org,经过上面的数据流处理后,网页的url变成了 about:blank ,这就使得网页里采用相对路径的文件,如 images/piaoyi.gif 的路径发生了错误,即变成了 about:blankimages/piaoyi.gif ,明显这是路径错误。解决的方法,就是替换所有相对路径为绝对路径。方法就是再html代码前加上这么一句:<base href="http://www.piaoyi.org">     另外,还有一种方法可以动态的写入源码到 webbrowser 或 embeddedwb 里,如下: procedure TForm11.Button1Click(Sender: TObject);
    var
        v:OleVariant;
        HTMLDocument:ihtmldocument2;
    begin
        HTMLDocument := EmbeddedWB1.Document as IHTMLDocument2;
        v := VarArrayCreate([0, 0], varVariant);
        v[0] := '这里写入html代码';
        HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
        HTMLDocument.Close;
    end;
     
  • 相关阅读:
    进程(WINAPI),遍历并查找树状的进程信息,实现控制系统进程
    HDU 4786 Fibonacci Tree(生成树,YY乱搞)
    Linux信号通讯编程
    HDU 3635 Dragon Balls(带权并查集)
    还原数据库出现“未获得排他訪问”解决方法(杀死数据库连接的存储过程sqlserver)
    java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称而且未指定默认驱动程序解决方法
    【C++基础 02】深拷贝和浅拷贝
    内核链接的简单使用
    I2C测试【转】
    [RK3288]PMU配置(RK808)【转】
  • 原文地址:https://www.cnblogs.com/honeynm/p/4169657.html
Copyright © 2011-2022 走看看