Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, Vcl.StdCtrls,
- ActiveX, MSHTML, ComCtrls, ComObj;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- WebBrowser1: TWebBrowser;
- btn1: TButton;
- mm1: TMemo;
- procedure Button1Click(Sender: TObject);
- procedure btn1Click(Sender: TObject);
- private
- procedure Button2Click(Sender: TObject);
- function GetFrame(FrameNo: Integer): IWebBrowser2;
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- 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
- if p = 0 then
- begin
- pickFrame := p;
- HTMLDoc := WebBrowser1.Document as IHTMLDocument2;
- WebDoc := GetBrowserForFrame(HTMLDoc, pickFrame).Document as IHTMLDocument2;
- if WebDoc <> nil then
- begin
- Result := GetFrameSource(WebDoc);
- Form1.mm1.Lines.Text := WebDoc.body.innerHTML;
- // WB_SaveFrameToFile(WebDoc, 'c:\Frame' + IntToStr(p) + '.html');
- // ShowMessage(HTMLDoc.Get_parentWindow.Get_name);
- // ShowMessage(HTMLDoc.Get_parentWindow.Parent.Get_document.nameProp);
- end;
- end;
- end;
- except
- Result := 'No Source Available';
- end;
- end;
- // Test:
- procedure TForm1.btn1Click(Sender: TObject);
- begin
- WebBrowser1.Silent := True;
- WebBrowser1.Navigate('http://webmail.iol.pt/');
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- SaveWBFrames(WebBrowser1);
- end;
- function TForm1.GetFrame(FrameNo: Integer): IWebBrowser2;
- var
- OleContainer: IOLEContainer;
- enum: ActiveX.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;
- // 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.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement