如何直接访问WebBrowser控件中的HTML源码 |
答題得分者是:timhuang
|
vclphi
一般會員 ![]() ![]() 發表:28 回覆:39 積分:13 註冊:2003-03-06 發送簡訊給我 |
我看到一篇文章,名为《直接访问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 發送簡訊給我 |
|
vclphi
一般會員 ![]() ![]() 發表:28 回覆:39 積分:13 註冊:2003-03-06 發送簡訊給我 |
|
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
關於你的問題, 由於小弟沒有用過 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 發送簡訊給我 |
|
tsung-yu
一般會員 ![]() ![]() 發表:0 回覆:3 積分:0 註冊:2003-05-07 發送簡訊給我 |
我只使用下列碼取得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 發送簡訊給我 |
|
tsung-yu
一般會員 ![]() ![]() 發表:0 回覆:3 積分:0 註冊:2003-05-07 發送簡訊給我 |
有,其實我改成這樣.
第三行出現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 發送簡訊給我 |
謝了,我找到原因了! 分成兩段即可, 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |