線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4079
推到 Plurk!
推到 Facebook!

如何直接访问WebBrowser控件中的HTML源码

答題得分者是:timhuang
vclphi
一般會員


發表:28
回覆:39
積分:13
註冊:2003-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-10 10:35:40 IP:218.5.xxx.xxx 未訂閱
我看到一篇文章,名为《直接访问WebBrowser控件中的HTML源码》 内容如下:WebBrowser控件中的Document对象,这个对象提供了一个IPersistStreamInit接口,通过此接口,可以方便地实现对HTML源码的读写。 以下是IPersistStreamInit接口的相关定义及说明: { IPersistStream interface } {$EXTERNALSYM IPersistStream} IPersistStream = interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] function IsDirty: HResult; stdcall; // 最后一次存盘后是否被修改 function Load(const stm: IStream): HResult; stdcall; // 从流中载入 function Save(const stm: IStream; fClearDirty: BOOL): HResult; stdcall; // 保存到流 function GetSizeMax(out cbSize: Largeint): HResult; stdcall; // 取得保存所需空间大小 end; { IPersistStreamInit interface } {$EXTERNALSYM IPersistStreamInit} IPersistStreamInit = interface(IPersistStream) ['{7FD52380-4E07-101B-AE2D-08002B2EC713}'] function InitNew: HResult; stdcall; // 初始化 end; 首先来实现写 procedure SetHtml(const WebBrowser: TWebBrowser; const Html: string); var Stream: IStream; hHTMLText: HGLOBAL; psi: IPersistStreamInit; begin if not Assigned(WebBrowser.Document) then Exit; hHTMLText := GlobalAlloc(GPTR, Length(Html) 1); if 0 = hHTMLText then RaiseLastWin32Error; CopyMemory(Pointer(hHTMLText), PChar(Html), Length(Html)); OleCheck(CreateStreamOnHGlobal (hHTMLText, True, Stream)); try OleCheck(WebBrowser.Document. QueryInterface(IPersistStreamInit, psi)); try OleCheck(psi.InitNew); OleCheck(psi.Load(Stream)); finally psi := nil; end; finally Stream := nil; end; end; 接着来实现HTML源码的读 function GetHtml(const WebBrowser: TWebBrowser): string; const BufSize = $10000; var Size: Int64; Stream: IStream; hHTMLText: HGLOBAL; psi: IPersistStreamInit; begin if not Assigned(WebBrowser.Document) then Exit; OleCheck(WebBrowser.Document.QueryInterface (IPersistStreamInit, psi)); try //OleCheck(psi.GetSizeMax(Size)); hHTMLText := GlobalAlloc(GPTR, BufSize); if 0 = hHTMLText then RaiseLastWin32Error; OleCheck(CreateStreamOnHGlobal(hHTMLText, True, Stream)); try OleCheck(psi.Save(Stream, False)); Size := StrLen(PChar(hHTMLText)); SetLength(Result, Size); CopyMemory(PChar(Result), Pointer(hHTMLText), Size); finally Stream := nil; end; finally psi := nil; end; end; ---- 我在程序的private部分加了procedure SetHtml和function GetHtml的声明,后将程序粘贴,考虑到OleCheck属于Unit Comobj,又引用了该单元,又加一句“psi:=WebBrowser.Document as IPersistStreamInit;”但运行后显视: Undeclared identifier:'IPersistStreamInit'; Undeclared identifier:'IStream'; symbol'RaiseLastWin32Error'is deprecated Undeclared identifier:'CreateStreamOnHGlobal';等错误信息。 我查了一下,IStream属于Unit Classes的TstreamAdapter类,不知程序该如何改动?该如何读取WebBrowser控件中的HTML源码
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-10 13:04:10 IP:211.76.xxx.xxx 未訂閱
HI,    要取得 WebBrowser 中的 html 碼, 可以利用如下的程式:
procedure TForm1.Button3Click(Sender: TObject);
var
  hd: IHtmlDocument2;
begin
  hd := WebBrowser1.Document as IHtmlDocument2;
  Memo1.Lines.Text := hd.body;
end;
記得要 use MSHtml
vclphi
一般會員


發表:28
回覆:39
積分:13
註冊:2003-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-10 16:04:27 IP:218.5.xxx.xxx 未訂閱
多谢timhuang兄,问题解决了。我还有几点不明白: 以前的DelPhi4 中有个HTML控件,是否在单元MSHtml中?TWebBrowser类在SHDocVw_TLB单元中,IHtmlDocument2为WebBrowser控件的Document类,为何要use MSHtml?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-10 17:10:03 IP:211.76.xxx.xxx 未訂閱
關於你的問題, 由於小弟沒有用過 delphi 4 , 所以不清楚其 html control 是 否在 MSHtml 中, 不過小弟猜測應該不是.... 另外, 由於 IHTMLDocument2 是定義在 MSHtml 中, 即系統中的 MSHtml.dll 此檔案, 所以若是要使用 document 以下的所有功能, 必須要 use MSHtml, 包含 form 中的元件, onclick event, 圖檔 等許多相關 html 中的東東都是!! webbroswer 和 htmldocument 並無直接關係, 只是在 webbrowser 中有一個 document 成員而已, 是否要定義在一起, 其實 delphi 是依循 windows 的設 計來區分.. SHDocVw UNIT 對應的是 SHDocVw.DLL MSHtml UNIT 對應的則是 MSHtml.DLL
vclphi
一般會員


發表:28
回覆:39
積分:13
註冊:2003-03-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-11 09:11:08 IP:218.5.xxx.xxx 未訂閱
请问timhuang兄,你的那些资料是哪查到的?DelPhi 的Help里说明不清。 另外,我还是不明白:WebBrowser1.Document as IHtmlDocument2; 说明IHtmlDocument2是WebBrowser的接口,应该定义在 SHDocVw_TLB单元中,为何反在MSHtml单元中?
tsung-yu
一般會員


發表:0
回覆:3
積分:0
註冊:2003-05-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-08 09:50:07 IP:61.30.xxx.xxx 未訂閱
我只使用下列碼取得html碼,但是執行到 Memo1.Lines.Text := hd.body; 會出現exception,請教哪裡出問題? ----------- 要取得 WebBrowser 中的 html 碼, 可以利用如下的程式: procedure TForm1.Button3Click(Sender: TObject); var hd: IHtmlDocument2; begin hd := WebBrowser1.Document as IHtmlDocument2; Memo1.Lines.Text := hd.body; end; 記得要 use MSHtml
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-08 11:43:56 IP:211.76.xxx.xxx 未訂閱
請問你有先使用 WebBrowser1.Navigate('URL'); 將 WebBrowser1 瀏覽網頁內容嗎? 沒有的話是無法取到 hd.body; 的哦, 請檢查一下..
tsung-yu
一般會員


發表:0
回覆:3
積分:0
註冊:2003-05-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-08 14:32:52 IP:61.220.xxx.xxx 未訂閱
有,其實我改成這樣. 第三行出現exception, 我用delphi7    procedure TForm1.Button3Click(Sender: TObject); var hd: IHtmlDocument2; begin     WebBrowser1.Navigate('http://www.kimo.com.tw');     hd := WebBrowser1.Document as IHtmlDocument2;     Memo1.Lines.Text := hd.body;    end;    
引言: 請問你有先使用 WebBrowser1.Navigate('URL'); 將 WebBrowser1 瀏覽網頁內容嗎? 沒有的話是無法取到 hd.body; 的哦, 請檢查一下..
tsung-yu
一般會員


發表:0
回覆:3
積分:0
註冊:2003-05-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-08 16:26:30 IP:210.202.xxx.xxx 未訂閱
謝了,我找到原因了! 分成兩段即可, procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('http://www.kimo.com.tw'); end ; procedure TForm1.Button3Click(Sender: TObject); var hd: IHtmlDocument2; begin hd := WebBrowser1.Document as IHtmlDocument2; Memo1.Lines.Text := hd.body; end;
Blueberrug
一般會員


發表:14
回覆:50
積分:17
註冊:2005-05-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-01 16:50:39 IP:220.130.xxx.xxx 未訂閱
請問改用bcb的方式要如何撰寫呢?
系統時間:2024-07-03 16:56:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!