直接访问WebBrowser控件中的HTML源码(1) 直接访问WebBrowser控件中的HTML源码 华中师范大学 卢小海 ---- 为了实现在自己的程序中显示HTML文档,我们一般采用IE(Internet EXPlorer本文中简称为IE)发行时附带的一个ActiveX控件TWebBrowser。这个控件使用和IE相同的内核,功能强大,并从Delphi5开始,正式得到Inprise公司的支持,取代了原来的那个THTML控件,成为Delphi中显示HTML文档的首选控件。 ---- 但是在实际编程过程中,我发现这个控件提供的功能有很多限制,比如对HTML文档的浏览,只能通过指定URL或文件名来实现,不能像以往使用THTML控件那样直接读写HTML源码。因此如果程序动态生成了一段HTML文本,就必须把文本内容先写到一个临时文件,然后再将此文件的文件名传递给WebBrowser控件,实现显示。走这一个弯路使程序响应速度受到很大影响,而且容易遗留下一些"垃圾"(临时文件)。 ---- 在考察了一些使用了WebBrowser控件的程序后,我发现大部分程序,如著名国产软件FoxMail,都是使用的通过临时文件传递HTML文档的方法;但一些国外的软件,如MS自己的Outlook EXPress则不存在这个问题,而因为其无需产生临时文件,因此对HTML文档的显示速度明显超过Foxmail。 ---- 为此,我查阅了一些相关资料,最后在网友的帮助下找到了实现直接访问WebBrowser控件中的HTML源码的方法。在此要特别感谢白云黄鹤BBS(bbs.whnet.edu.cn)上的网友AngleFalls提供线索。 ---- 其实,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}']