vbwebbrowser控件:直接访问WebBrowser控件中的HTML源码 (收藏)-vb教程



问WebBrowserControl控件中HTML源码
作者: 评价: 上站日期: 2002-05-22
内容介绍说明:
来源:

--------------------------------------------------------------------------------

html
webbrowser.OleObject.document.documentelement.innerhtml;
Text
webbrowser.OleObject.document.documentelement.innerText;
********************
为了实现在自己中显示HTML文档我们般采用IE(Internet Explorer本文中简称为IE)发行时附带个ActiveXControl控件TWebBrowser

这个Control控件使用和IE相同内核功能强大并从Delphi5开始正式得到Inprise公司支持取代了原来那个THTMLControl控件成为Delphi中显

示HTML文档首选Control控件
但是在实际编程过程中我发现这个Control控件提供功能有很多限制比如对HTML文档浏览只能通过指定URL或文件名来实现不能像以往使

用THTMLControl控件那样直接读写HTML源码因此如果动态生成了段HTML文本就必须把文本内容先写到个临时文件然后再将此文件

件名传递给WebBrowserControl控件实现显示走这个弯路使响应速度受到很大影响而且容易遗留下些\"垃圾\"(临时文件)
---- 在考察了些使用了WebBrowserControl控件我发现大部分如著名国产软件SoftwareFoxMail都是使用通过临时文件传递HTML文档

思路方法;但些国外软件Software如MS自己OutLook Express则不存在这个问题其无需产生临时文件因此对HTML文档显示速度明显超

过Foxmail
---- 为此我查阅了些相关资料最后在网友帮助下找到了实现直接访问WebBrowserControl控件中HTML源码思路方法在此要特别感谢白云黄

鹤BBS(bbs.whnet.edu.cn)上网友AngleFalls提供线索
---- 其实WebBrowserControl控件中Document对象这个对象提供了个IPersistStreamInit接口通过此接口我们可以方便地实现对HTML源

读写
---- 以下是IPersistStreamInit接口相关定义及介绍说明:
{ IPersistStream erface }
{$EXTERNALSYM IPersistStream}
IPersistStream = erface(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: Large):
HResult; stdcall; // 取得保存所需空间大小
end;

{ IPersistStreamInit erface }

{$EXTERNALSYM IPersistStreamInit}
IPersistStreamInit = erface(IPersistStream)

[´{7FD52380-4E07-101B-AE2D-08002B2EC713}´]
function InitNew: HResult; stdcall; //
end;

首先来实现写这是最迫切要求:


procedure SetHtml(const WebBrowser:
TWebBrowser; const Html: );
var
Stream: IStream;
hHTMLText: HGLOBAL;
psi: IPersistStreamInit;
begin
not Assigned(WebBrowser.Document) then Exit;


hHTMLText := GlobalAlloc(GPTR, Length(Html) + 1);
0 = hHTMLText then RaiseLastWin32Error;

CopyMemory(Poer(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;
---- 首先此过程需要两个参数WebBrowser是显示目Control控件Html是需要显示HTML源码;然后先检查WebBrowser.Document对象是否

有效无效则退出;接着在系统全局堆里分配块内存将需要显示HTML源码复制进去这是步需要建立个WebBrowserControl控件可以

读取GlobalAlloc参数GPTR表示需要分配块固定以0化过内存区域如果分配失败则返回0则通过

RaiseLastWin32Error引发个异常提示用户;然后用CreateStreamOn
HGlobal建立个基于全局堆内存块第 2个参数如果为True则流在释放时自动释放所占全局堆内存如果 建立成功则此流和刚刚建

内存块共用同块内存区域接着用WebBrowser.Document.QueryInterface建立个IPersistStreamInit接口然后

就可以直接使用此接口psi.InitNew化状态;psi.Load(Stream)从流中载入HTML源码
---- 至此以Html参数指定HTML源码就在WebBrowser参数指定Control控件中显示出来


---- 值得注意每个有关COM接口也就是那些返回类型为HResult都必须以OleCheck包装个不检查返回状

COM接口操作实在太危险了;此外接口释放虽然Delphi可以在后台自动完成但作为个好编程习惯还是应该显式地手工释放

释放只需将接口设为nil即可
---- 接着来实现HTML源码读:
function GetHtml(const WebBrowser: TWebBrowser): ;
const
BufSize = $10000;
var
Size: Int64;
Stream: IStream;
hHTMLText: HGLOBAL;
psi: IPersistStreamInit;
begin
not Assigned(WebBrowser.Document) then Exit;
OleCheck(WebBrowser.Document.QueryInterface (IPersistStreamInit, psi));
try
//OleCheck(psi.GetSizeMax(Size));
hHTMLText := GlobalAlloc(GPTR, BufSize);
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), Poer(hHTMLText), Size);
finally
Stream := nil;
end;
finally
psi := nil;
end;
end;
---- 此个参数WebBrowser指定从那个Control控件读取HTML源码返回串为此Control控件中HTML源码首先还是要先检查

WebBrowser.Document对象是否有效无效则退出;然后取得IPersistStreamInit接口;接着取得HTML源码大小:本来应该使用

IPersistStreamInit接口GetSizeMax但在我机器上测试这个范围值衡为0无效因此只能先定义个足够大缓冲区

BufSize = $10000字节(注意此缓冲区应该足够大);然后同样地分配全局堆内存块建立流然后将HTML文本写到流中此HTML文本在流

中是以#0结尾因此可以用Size := StrLen(PChar(hHTMLText))取得实际长度用SetLength(Result, Size);设置返回串长度为

HTML源码实际长度最后复制串到返回串中
---- 至此直接访问WebBrowserControl控件中HTML源码所需两个全部解析完毕
---- 不过需要注意在使用这两个最好对WebBrowser.Document对象进行下面提供通过显示个空白页面实

现WebBrowser.Document对象
procedure ShowBlankPage(WebBrowser: TWebBrowser);
var
URL: OleVariant;
begin
URL := ´about:blank´;
WebBrowser.Navigate2(URL);
end;
---- 建议在你有WebBrowserControl控件FormFormCreate事
件里
WebBrowser.Document对象
---- 本文在Win NT + Delphi 5 环境下调试通过

WebBrowser类和WebBrowser_V1类区别



编号:QA002749
建立日期: 2000年3月20日 最后修改日期:2000年3月20日
所属类别:

Visual Basic - Web浏览器

xyjun:
操作系统: win98
编程工具: VB6.0
问题: 请问在vb对象浏览器中WebBrowser类和WebBrowser_V1类区别
我在窗体中插入了个WebBrowserControl控件但是只有Window2事件而没有Window事件请问如何用window事件将网页上打开

网页在同窗口显示(禁止开新窗口)?以及事件Window2和Window区别?

回答:

WebBrowser_V1是IE3而IE4以后版本使用WebBrowser类
如果你希望新打开网页出现在同个窗口可以这样做:
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Set ppDisp = WebBrowser1.Object
End Sub
事件NewWindow2和Window区别有较大区别使用事件NewWindow你可以知道点击链接是什么而使用事件NewWindow2无法知道

NewWindow只有在用户选择“在新窗口打开链接”时才会激发而NewWindow2除了在此时激发外当网页使用window.open打开新窗口时也激发

上面工作也可以使用NewWindow实现:
Dim WithEvents Web_V1 As SHDocVwCtl.WebBrowser_V1

Private Sub Form_Load
Set Web_V1 = WebBrowser1.Object
WebBrowser1.Navigate2 \"\"
End Sub

Private Sub Web_V1_NewWindow(ByVal URL As String, _
ByVal Flags As Long, _
ByVal TargetFrameName As String, _
PostData As Variant, _
ByVal Headers As String, _
Processed As Boolean)
Processed = True
WebBrowser1.Navigate URL
End Sub




Tags:  vbwebbrowser webbrowser控件详解 webbrowser控件 vbwebbrowser控件

延伸阅读

最新评论

发表评论