1. 程式人生 > >動態更改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;