zoukankan      html  css  js  c++  java
  • [转]save all TWebbrowser Frame Sources?

    注:有一定的参考价值,转存

    // Code 1

    uses
      
    ActiveX, MSHTML_TLB, ComCtrls, ComObj;

    function GetBrowserForFrame(Doc: IHTMLDocument2; nFrame: Integer): IWebBrowser2;
      //Thanks to Rik Barker
      //returns an interface to the frame's browser
    var
      
    pContainer: IOLEContainer;
      enumerator: ActiveX.IEnumUnknown;
      nFetched: PLongInt;
      unkFrame: IUnknown;
      hr: HRESULT;
    begin
      
    Result := nil;
      nFetched := nil;
      // Cast the page as an OLE container
      
    pContainer := Doc as IOleContainer;
      // Get an enumerator for the frames on the page
      
    hr := pContainer.EnumObjects(OLECONTF_EMBEDDINGS or OLECONTF_OTHERS, enumerator);
      if hr <> S_OK then
      begin
        
    pContainer._Release;
        Exit;
      end;
      // Now skip to the frame we're interested in
      
    enumerator.Skip(nFrame);
      // and get the frame as IUnknown
      
    enumerator.Next(1,unkFrame, nFetched);
      // Now QI the frame for a WebBrowser Interface - I'm not  entirely
      // sure this is necessary, but COM never ceases to surprise me
      
    unkframe.QueryInterface(IID_IWebBrowser2, Result);
    end;

    function GetFrameSource(WebDoc: iHTMLDocument2): string;
      //returns frame HTML and scripts as a text string
    var
      
    re: integer;
      HTMLel: iHTMLElement;
      HTMLcol: iHTMLElementCollection;
      HTMLlen: Integer;
      ScriptEL: IHTMLScriptElement;
    begin
      
    Result := '';
      if Assigned(WebDoc) then
      begin
        
    HTMLcol := WebDoc.Get_all;
        HTMLlen := HTMLcol.Length;
        for re := 0 to HTMLlen - 1 do
        begin
          
    HTMLel := HTMLcol.Item(re, 0) as iHTMLElement;
          if HTMLEl.tagName = 'HTML' then
            
    Result := Result + HTMLEl.outerHTML;
        end;
      end;
    end;

    function WB_SaveFrameToFile(HTMLDocument: IHTMLDocument2;
      const FileName: TFileName): Boolean;
    // Save IHTMLDocument2 to a file
    var
      
    PersistFile: IPersistFile;
    begin
      
    PersistFile := HTMLDocument as IPersistFile;
      PersistFile.Save(StringToOleStr(FileName), System.True);
    end;


    function SaveWBFrames(WebBrowser1: TWebBrowser): string;
    // return the source for all frames in the browser
    var
      
    Webdoc, HTMLDoc: ihtmldocument2;
      framesCol: iHTMLFramesCollection2;
      FramesLen: integer;
      pickFrame: olevariant;
      p: integer;
    begin
      try
        
    WebDoc := WebBrowser1.Document as IHTMLDocument2;
        Result := GetFrameSource(WebDoc);

        // §§§ Hier kann Result in eine Datei gespeichert werden §§§§  oder  mit
        // WB_SaveFrameToFile(WebDoc,'c:MainPage.html');

        //Handle multiple or single frames
        
    FramesCol := WebDoc.Get_frames;
        FramesLen := FramesCol.Get_length;
        if FramesLen > 0 then
          for 
    p := 0 to FramesLen - 1 do
          begin
            
    pickframe := p;
            HTMLDoc   := WebBrowser1.Document as iHTMLDocument2;

            WebDoc := GetBrowserForFrame(HTMLDoc, pickframe).document as iHTMLDocument2;
            if WebDoc <> nil then
            begin
              
    Result := GetFrameSource(WebDoc);
              WB_SaveFrameToFile(WebDoc, 'c:Frame' + IntToStr(p) + '.html');
              // ShowMessage(HTMLDoc.Get_parentWindow.Get_name);
              // ShowMessage(HTMLDoc.Get_parentWindow.Parent.Get_document.nameProp);

            
    end;
          end;
      except
        
    Result := 'No Source Available';
      end;
    end;

    // Test:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      
    SaveWBFrames(Webbrowser1);
    end;


    // Code 2
    uses
      
    ActiveX;

    function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2;
    var
      
    OleContainer: IOleContainer;
      enum: IEnumUnknown;
      unk: IUnknown;
      Fetched: PLongint;
    begin
      while 
    Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
        
    Application.ProcessMessages;
      if Assigned(Webbrowser1.document) then
      begin
        
    Fetched := nil;
        OleContainer := Webbrowser1.Document as IOleContainer;
        OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
        Enum.Skip(FrameNo);
        Enum.Next(1, Unk, Fetched);
        Result := Unk as IWebbrowser2;
      end
      else
        
    Result := nil;
    end;

    // Load sample page
    // Testseite laden
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      
    Webbrowser1.Navigate('http://www.warebizprogramming.com/tutorials/html/framesEx1.htm');
    end;

    // Save all frames in single files
    // Alle Frameseiten in einzelne Dateien speichern
    procedure TForm1.Button2Click(Sender: TObject);
    var
      
    IpStream: IPersistStreamInit;
      AStream: TMemoryStream;
      iw: IWebbrowser2;
      i: Integer;
      sl: TStringList;
    begin
      for 
    i := 0 to Webbrowser1.OleObject.Document.frames.Length - 1 do
      begin
        
    iw := GetFrame(i);
        AStream := TMemoryStream.Create;
        try
          
    IpStream := iw.document as IPersistStreamInit;
          if Succeeded(IpStream.save(TStreamadapter.Create(AStream), True)) then
          begin
            
    AStream.Seek(0, 0);
            sl := TStringList.Create;
            sl.LoadFromStream(AStream);
            sl.SaveToFile('c:frame' + IntToStr(i) + '.txt');
            //  memo1.Lines.LoadFromStream(AStream);
            
    sl.Free;
          end;
        except
        end
    ;
        AStream.Free;
      end;
    end;

    end.

    http://www.swissdelphicenter.ch/en/showcode.php?id=2054

  • 相关阅读:
    Atitit.ati orm的设计and架构总结 适用于java c# php版
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.js 与c# java交互html5化的原理与总结.doc
  • 原文地址:https://www.cnblogs.com/zhqian/p/5935309.html
Copyright © 2011-2022 走看看