收藏 分享(赏)

直接访问WebBrowser控件中的HTML源码.doc

上传人:hwpkd79526 文档编号:6359004 上传时间:2019-04-09 格式:DOC 页数:4 大小:30.50KB
下载 相关 举报
直接访问WebBrowser控件中的HTML源码.doc_第1页
第1页 / 共4页
直接访问WebBrowser控件中的HTML源码.doc_第2页
第2页 / 共4页
直接访问WebBrowser控件中的HTML源码.doc_第3页
第3页 / 共4页
直接访问WebBrowser控件中的HTML源码.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、直接访问 WebBrowser 控件中的 HTML 源码.txt 不怕偷儿带工具,就怕偷儿懂科技! 1 品味生活,完善人性。存在就是机会,思考才能提高。人需要不断打碎自己,更应该重新组装自己。直接访问 WebBrowser 控件中的 HTML 源码作者:卢小海 - 为了实现在自己的程序中显示 HTML 文档,我们一般采用 IE(Internet Explorer 本文中简称为 IE)发行时附带的一个 ActiveX 控件 TWebBrowser。这个控件使用和 IE 相同的内核,功能强大,并从 Delphi5 开始,正式得到 Inprise 公司的支持,取代了原来的那个 THTML 控件,成为

2、 Delphi 中显示 HTML 文档的首选控件。 - 但是在实际编程过程中,我发现这个控件提供的功能有很多限制,比如对 HTML 文档的浏览,只能通过指定 URL 或文件名来实现,不能像以往使用 THTML 控件那样直接读写 HTML源码。因此如果程序动态生成了一段 HTML 文本,就必须把文本内容先写到一个临时文件,然后再将此文件的文件名传递给 WebBrowser 控件,实现显示。走这一个弯路使程序响应速度受到很大影响,而且容易遗留下一些“垃圾“(临时文件)。 - 在考察了一些使用了 WebBrowser 控件的程序后,我发现大部分程序,如著名国产软件FoxMail,都是使用的通过临时文

3、件传递 HTML 文档的方法;但一些国外的软件,如 MS 自己的 OutLook Express 则不存在这个问题,而因为其无需产生临时文件,因此对 HTML 文档的显示速度明显超过 Foxmail。 - 为此,我查阅了一些相关资料,最后在网友的帮助下找到了实现直接访问 WebBrowser控件中的 HTML 源码的方法。在此要特别感谢白云黄鹤 BBS()上的网友AngleFalls 提供线索。 - 其实,WebBrowser 控件中的 Document 对象,这个对象提供了一个IPersistStreamInit 接口,通过此接口,我们可以方便地实现对 HTML 源码的读写。 - 以下是 I

4、PersistStreamInit 接口的相关定义及说明: IPersistStream interface $EXTERNALSYM IPersistStreamIPersistStream = interface(IPersist)00000109-0000-0000-C000-000000000046function IsDirty: HResult; stdcall; / 最后一次存盘后是否被修改function Load(const stm: IStream): HResult; stdcall;/ 从流中载入function Save(const stm: IStream; fCl

5、earDirty: BOOL): HResult; stdcall;/ 保存到流function GetSizeMax(out cbSize: Largeint): HResult; stdcall; / 取得保存所需空间大小end; IPersistStreamInit interface $EXTERNALSYM IPersistStreamInitIPersistStreamInit = interface(IPersistStream)7FD52380-4E07-101B-AE2D-08002B2EC713function InitNew: HResult; stdcall; / 初始

6、化end;首先来实现写,因为这是最迫切的要求:procedure SetHtml(const WebBrowser: TWebBrowser; const Html: string);varStream: IStream;hHTMLText: HGLOBAL;psi: IPersistStreamInit;beginif not Assigned(WebBrowser.Document) then Exit;hHTMLText := GlobalAlloc(GPTR, Length(Html) + 1);if 0 = hHTMLText then RaiseLastWin32Error;Cop

7、yMemory(Pointer(hHTMLText), PChar(Html), Length(Html);OleCheck(CreateStreamOnHGlobal(hHTMLText, True, Stream);tryOleCheck(WebBrowser.Document.QueryInterface(IPersistStreamInit, psi);tryOleCheck(psi.InitNew);OleCheck(psi.Load(Stream);finallypsi := nil;end;finallyStream := nil;end;end;- 首先,此过程需要的两个参数,

8、WebBrowser 是显示目的控件,Html 是需要显示的HTML 源码;然后,先检查 WebBrowser.Document 对象是否有效,无效则退出;接着在系统全局堆里分配一块内存,将需要显示的 HTML 源码复制进去。这是因为下一步需要建立一个WebBrowser 控件可以读取的流。GlobalAlloc 函数的参数 GPTR 表示需要分配一块固定的以0 初始化过的内存区域,如果分配失败则返回 0,则通过 RaiseLastWin32Error 函数引发一个异常,提示用户;然后用 CreateStreamOnHGlobal 函数建立一个基于全局堆内存块的流,第二个参数如果为 True

9、则流在释放时自动释放所占全局堆内存。如果建立成功则此流和刚刚建立的内存块共用同一块内存区域。接着用 WebBrowser.Document.QueryInterface 函数建立一个 IPersistStreamInit 接口。然后就可以直接使用此接口,psi.InitNew 初始化状态;psi.Load(Stream)从流中载入 HTML 源码。 - 至此,以 Html 参数指定的 HTML 源码就在 WebBrowser 参数指定的控件中显示出来。 - 值得注意的是,每个关于 COM 接口的函数调用,也就是那些返回类型为 HResult 的函数,都必须以 OleCheck 包装,因为一个不

10、检查返回状态的 COM 接口操作实在太危险了;此外接口的释放,虽然 Delphi 可以在后台自动完成,但作为一个好的编程习惯,还是应该显式地手工释放,释放只需将接口设为 nil 即可。 - 接着来实现 HTML 源码的读: function GetHtml(const WebBrowser:TWebBrowser): string;constBufSize = $10000;varSize: Int64;Stream: IStream;hHTMLText: HGLOBAL;psi: IPersistStreamInit;beginif not Assigned(WebBrowser.Docum

11、ent) 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);tryOleCheck(psi.Save(Stream, False);Size := S

12、trLen(PChar(hHTMLText);SetLength(Result, Size);CopyMemory(PChar(Result), Pointer(hHTMLText), Size);finallyStream := nil;end;finallypsi := nil;end;end;- 此函数有一个参数 WebBrowser 指定从那个控件读取 HTML 源码,返回一个字符串为此控件中的 HTML 源码。首先还是要先检查 WebBrowser.Document 对象是否有效,无效则退出;然后取得 IPersistStreamInit 接口;接着取得 HTML 源码的大小:本来应

13、该使用IPersistStreamInit 接口的 GetSizeMax 函数,但在我的机器上测试,这个函数范围值衡为0,无效。因此只能先定义一个足够大的缓冲区,如 BufSize = $10000 字节(注意此缓冲区应该足够大);然后同样地分配全局堆内存块,建立流,然后将 HTML 文本写到流中。因为此HTML 文本在流中是以#0 结尾的字符串,因此可以用 Size := StrLen(PChar(hHTMLText)取得实际长度,用 SetLength(Result, Size);设置返回字符串长度为 HTML 源码实际长度,最后复制字符串到返回字符串中。 - 至此,直接访问 WebBro

14、wser 控件中的 HTML 源码所需的两个函数全部解析完毕。 - 不过需要注意的时,在使用这两个函数前,最好对 WebBrowser.Document 对象进行初始化。下面提供一个函数,通过显示一个空白页面实现 WebBrowser.Document 对象初始化。 procedure ShowBlankPage(WebBrowser: TWebBrowser);varURL: OleVariant;beginURL := about:blank;WebBrowser.Navigate2(URL);end;- 建议在你有 WebBrowser 控件的 Form 的 FormCreate 事件里调用此函数,初始化WebBrowser.Document 对象。 - 本文程序在 Win NT + Delphi 5 环境下调试通过

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Web服务

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报