- 浏览: 5161293 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
为了实现在自己的程序中显示HTML文档,我们一般采用IE(Internet Explorer本文中简称为IE)发行时附带的一个ActiveX控件WebBrowser。这个控件使用和IE相同的内核,功能强大,并从Delphi5开始,正式得到Inprise公司的支持,取代了原来的那个THTML控件,成为Delphi中显示HTML文档的首选控件。
但是在实际编程过程中,这个控件提供的功能有很多限制,比如对HTML文档的浏览,只能通过指定URL或文件名来实现,不能像以往使用THTML控件那样直接读写HTML源码。因此如果程序动态生成了一段HTML文本,就必须把文本内容先写到一个临时文件,然后再将此文件的文件名传递给WebBrowser控件,实现显示。走这一个弯路使程序响应速度受到很大影响,而且容易遗留下一些"垃圾"(临时文件)。
在考察了一些使用了WebBrowser控件的程序后,发现大部分程序,如着名国产软件FoxMail,都是使用的通过临时文件传递HTML文档的方法;但一些国外的软件,如MS自己的OutLook Express则不存在这个问题,而因为其无需产生临时文件,因此对HTML文档的显示速度明显超过Foxmail。
其实,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;
首先,此过程需要的两个参数,WebBrowser是显示目的控件,Html是需要显示的HTML源码;
然后,先检查WebBrowser.Document对象是否有效,无效则退出;
接着在系统全局堆里分配一块内存,将需要显示的HTML源码复制进去。
这是因为下一步需要建立一个WebBrowser控件可以读取的流。GlobalAlloc函数的参数GPTR表示需要分配一块固定的以0初始化过的内存区域,如果分配失败则返回0,则通过RaiseLastWin32Error函数引发一个异常,提示用户;然后用CreateStreamOnHGlobal函数建立一个基于全局堆内存块的流,第二个参数如果为True则流在释放时自动释放所占全局堆内存。如果建立成功则此流和刚刚建立的内存块共用同一块内存区域。接着用WebBrowser.Document.QueryInterface函数建立一个IPersistStreamInit接口。然后就可以直接使用此接口,psi.InitNew初始化状态;psi.Load(Stream)从流中载入HTML源码。
至此,以Html参数指定的HTML源码就在WebBrowser参数指定的控件中显示出来。
值得注意的是,每个关于COM接口的函数调用,也就是那些返回类型为HResult的函数,都必须以OleCheck包装,因为一个不检查返回状态的COM接口操作实在太危险了;此外接口的释放,虽然Delphi可以在后台自动完成,但作为一个好的编程习惯,还是应该显式地手工释放,释放只需将接口设为nil即可。
接着来实现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;
此函数有一个参数WebBrowser指定从那个控件读取HTML源码,返回一个字符串为此控件中的HTML源码。首先还是要先检查WebBrowser.Document对象是否有效,无效则退出;然后取得IPersistStreamInit接口;接着取得HTML源码的大小:本来应该使用IPersistStreamInit接口的GetSizeMax函数,但在我的机器上测试,这个函数范围值衡为0,无效。因此只能先定义一个足够大的缓冲区,如BufSize = $10000字节(注意此缓冲区应该足够大);然后同样地分配全局堆内存块,建立流,然后将HTML文本写到流中。因为此HTML文本在流中是以#0结尾的字符串,因此可以用Size := StrLen(PChar(hHTMLText))取得实际长度,用SetLength(Result, Size);设置返回字符串长度为HTML源码实际长度,最后复制字符串到返回字符串中。
至此,直接访问WebBrowser控件中的HTML源码所需的两个函数全部解析完毕。
不过需要注意的时,在使用这两个函数前,最好对WebBrowser.Document对象进行初始化。下面提供一个函数,通过显示一个空白页面实现WebBrowser.Document对象初始化。
以下是引用片段:
procedure ShowBlankPage(WebBrowser:
TWebBrowser);
var
URL: OleVariant;
begin
URL := 'about:blank';
WebBrowser.Navigate2(URL);
end;
建议在有WebBrowser控件的Form的FormCreate事件里调用此函数,初始化WebBrowser.Document对象。本文程序在Win NT + Delphi 5 环境下调试通过。
但是在实际编程过程中,这个控件提供的功能有很多限制,比如对HTML文档的浏览,只能通过指定URL或文件名来实现,不能像以往使用THTML控件那样直接读写HTML源码。因此如果程序动态生成了一段HTML文本,就必须把文本内容先写到一个临时文件,然后再将此文件的文件名传递给WebBrowser控件,实现显示。走这一个弯路使程序响应速度受到很大影响,而且容易遗留下一些"垃圾"(临时文件)。
在考察了一些使用了WebBrowser控件的程序后,发现大部分程序,如着名国产软件FoxMail,都是使用的通过临时文件传递HTML文档的方法;但一些国外的软件,如MS自己的OutLook Express则不存在这个问题,而因为其无需产生临时文件,因此对HTML文档的显示速度明显超过Foxmail。
其实,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;
首先,此过程需要的两个参数,WebBrowser是显示目的控件,Html是需要显示的HTML源码;
然后,先检查WebBrowser.Document对象是否有效,无效则退出;
接着在系统全局堆里分配一块内存,将需要显示的HTML源码复制进去。
这是因为下一步需要建立一个WebBrowser控件可以读取的流。GlobalAlloc函数的参数GPTR表示需要分配一块固定的以0初始化过的内存区域,如果分配失败则返回0,则通过RaiseLastWin32Error函数引发一个异常,提示用户;然后用CreateStreamOnHGlobal函数建立一个基于全局堆内存块的流,第二个参数如果为True则流在释放时自动释放所占全局堆内存。如果建立成功则此流和刚刚建立的内存块共用同一块内存区域。接着用WebBrowser.Document.QueryInterface函数建立一个IPersistStreamInit接口。然后就可以直接使用此接口,psi.InitNew初始化状态;psi.Load(Stream)从流中载入HTML源码。
至此,以Html参数指定的HTML源码就在WebBrowser参数指定的控件中显示出来。
值得注意的是,每个关于COM接口的函数调用,也就是那些返回类型为HResult的函数,都必须以OleCheck包装,因为一个不检查返回状态的COM接口操作实在太危险了;此外接口的释放,虽然Delphi可以在后台自动完成,但作为一个好的编程习惯,还是应该显式地手工释放,释放只需将接口设为nil即可。
接着来实现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;
此函数有一个参数WebBrowser指定从那个控件读取HTML源码,返回一个字符串为此控件中的HTML源码。首先还是要先检查WebBrowser.Document对象是否有效,无效则退出;然后取得IPersistStreamInit接口;接着取得HTML源码的大小:本来应该使用IPersistStreamInit接口的GetSizeMax函数,但在我的机器上测试,这个函数范围值衡为0,无效。因此只能先定义一个足够大的缓冲区,如BufSize = $10000字节(注意此缓冲区应该足够大);然后同样地分配全局堆内存块,建立流,然后将HTML文本写到流中。因为此HTML文本在流中是以#0结尾的字符串,因此可以用Size := StrLen(PChar(hHTMLText))取得实际长度,用SetLength(Result, Size);设置返回字符串长度为HTML源码实际长度,最后复制字符串到返回字符串中。
至此,直接访问WebBrowser控件中的HTML源码所需的两个函数全部解析完毕。
不过需要注意的时,在使用这两个函数前,最好对WebBrowser.Document对象进行初始化。下面提供一个函数,通过显示一个空白页面实现WebBrowser.Document对象初始化。
以下是引用片段:
procedure ShowBlankPage(WebBrowser:
TWebBrowser);
var
URL: OleVariant;
begin
URL := 'about:blank';
WebBrowser.Navigate2(URL);
end;
建议在有WebBrowser控件的Form的FormCreate事件里调用此函数,初始化WebBrowser.Document对象。本文程序在Win NT + Delphi 5 环境下调试通过。
发表评论
-
Delphi中编程实现TWebBrowser查找及上一个、下一个功能
2016-08-18 13:58 1355代码比较简单,全部内容如下: //1:向下搜索;-1:向上 ... -
OLEDB的Excel的IMEX和HDR是什么意思
2013-11-23 21:15 2123转自:http://blog.csdn.net/baple/a ... -
c#获取应用程序目录
2013-10-23 22:35 1731string str1 =Process.GetCurrent ... -
Visual C# 方案 -> 文本操作快捷键
2013-10-07 22:34 2060转自:http://technet.microsoft.com ... -
Visual Studio 2005快捷键大全
2013-10-07 22:29 1644转自:http://www.cnblogs.com/mekon ... -
C#正则表达式测试小工具
2013-10-04 18:51 4781C#的正则表达式使用比较方便,但复杂的正则表达式还是需要测 ... -
C#正则表达式语法规则详解
2013-10-04 17:26 4043正则表达式通常包含字 ... -
C# WINFORM 捕获全局异常
2013-10-01 11:56 3039using System; using System.Coll ... -
Visual C# 中XML注释的使用(含注释在开发时显示换行)
2013-10-01 11:54 2467在C#智能注释时,常常希望它能在开发时显示为换行,使得提示更加 ... -
DevExpress汉化(WinForm)
2013-09-19 17:27 8285/* *隔壁老王原创,2013-09-21,转载请保留本人信息 ... -
VC中的CImage类
2011-04-17 22:19 8938今天查找如何实现 ... -
VC旋转图片
2011-04-16 16:45 3772转自:http://hi.baidu.com/sweetpig ... -
VC多线程编程(转)
2010-12-22 21:11 3197原文地址:http://www.cnblo ... -
Manifest的问题
2010-05-11 10:08 2306原始连接:http://www.zming ... -
Asp.Net中Word,Excel等office com组件操作权限的问题
2010-05-06 13:57 10203近日在打开原来写的一 ... -
如何注销windows server2003 服务器中的远程连接
2009-12-14 01:29 3809碰到超过远程连接数而无法连接服务器,可以采用如下方法解决 ... -
Makefile详解(3/3)
2009-12-01 12:32 1545一、函数库文件的成员 一个函数库文件由多个文件组成。你可以以 ... -
Makefile详解(2/3)
2009-12-01 12:29 2225八、目标变量 前面我们所讲的在Makefile中定义的变量都 ... -
Makefile详解(1/3)
2009-12-01 12:27 2186原文地址:http://blog.csdn ... -
OLE DB 的概念
2009-11-20 22:41 2106简单地说,OLE DB 是 ...
相关推荐
### 直接访问WebBrowser控件中的HTML源码 在探讨如何直接访问WebBrowser控件中的HTML源码之前,我们先来了解一下WebBrowser控件的基本概念及其重要性。WebBrowser 控件是基于 ActiveX 技术的一个组件,它允许开发者...
MFC WebBrowser控件加载HTMLVC++源码,WebBrowser控件加载HTML网页时不显示滚动条,实现事件 documentcomplete,当HTML下载完毕时再显示出来,然后在此事件代码中去掉滚动条。.zip
在这个教程中,我们将深入探讨如何使用WebBrowser控件来浏览并获取网页源码。 首先,让我们了解WebBrowser控件的基本用法。在VB.NET环境中,你可以通过拖拽WebBrowser控件到窗体或者ASP.NET页面上来添加它。该控件...
5,实现点链接而不弹窗,右击WebBrowser控件选择属性,在相应属性面板中查看它所支持的事件,激活NewWindow事件,在事件函数中添加如下代码; private void webBrowser1_NewWindow(object sender, CancelEventArgs ...
然后,可以将生成的HTML文件路径赋值给WebBrowser控件的`Navigate`方法,以便在控件中显示: ```vb WebBrowser1.Navigate "C:\path\to\temp.html" ``` 最后,别忘了在完成后释放资源,关闭Word文档并结束Word应用...
WebBrowser控件是Windows应用程序开发中的一个重要组件,它允许开发者在桌面应用中嵌入Web浏览功能。这个控件集包含了多种使用WebBrowser控件时的技巧和方法,可以帮助开发者更高效、更灵活地利用该控件。下面我们将...
在Microsoft Foundation Classes (MFC)框架中,WebBrowser控件是一个强大的工具,它允许开发者在桌面应用程序中嵌入Web浏览器的功能。这个控件是基于Internet Explorer的ActiveX控件,因此,它可以执行大部分IE浏览...
WebBrowser控件在Delphi编程环境中是一个非常重要的组件,它允许开发者在应用程序中嵌入一个完整的Web浏览器功能。这个控件通常基于Internet Explorer的引擎,因此它可以显示HTML内容,执行JavaScript,以及支持许多...
首先,WebBrowser控件是MFC提供的一个ActiveX控件,它允许应用程序嵌入Internet Explorer引擎,从而在桌面应用中浏览网页、执行HTML和JavaScript代码。这个控件的强大之处在于它可以与宿主应用程序进行深度交互,...
2. 执行JavaScript:WebBrowser控件还允许执行JavaScript代码。这在需要与网页上的JavaScript进行交互或执行特定功能时非常有用: ```csharp webBrowser1.Document.InvokeScript("myFunction", new object[] { "参数...
以上三种方法都可以实现在Webbrowser控件中动态生成和插入HTML内容的功能。 #### 四、页面滚动与前进后退判断 1. **页面滚动**: ```vb Private Sub Command2_Click() WebBrowser1.Document.parentwindow....
在提供的文件"IE内置的WebBrowser控件之--WEB打印.html"中,可能包含了使用WebBrowser控件进行打印的示例代码。这个HTML文件可能用于展示如何在客户端通过JavaScript或者其他方式触发WebBrowser控件的打印功能。 ...
通过调用`COleDispatchDriver::InvokeHelper`方法,可以调用WebBrowser控件的`ExecuteScript`方法执行JavaScript代码。例如,我们可以将一个字符串值传递给JavaScript函数: ```cpp COleDispatchDriver ...
在C#编程中,WebBrowser控件是一个非常实用的组件,它允许开发者在应用程序中集成网页浏览功能。本文将深入探讨如何在C#中利用内存来获取WebBrowser控件的截图,实现后台或隐藏窗体的截图功能。这对于自动化测试、...
在C#或VB.NET中,你可以像添加其他控件一样将`WebBrowser`添加到表单上,并通过代码设置其属性和事件。例如,`Navigate()`方法用于加载指定的URL,`DocumentText`属性可以用来设置或获取网页的HTML内容,`Document`...
我们需要将这些API的调用封装成JavaScript代码,并在WebBrowser控件的`Navigate`方法中加载到页面上。例如,我们可以创建一个JavaScript函数,用于加载地图,并调用这个函数来初始化地图: ```javascript function ...
WebBrowser控件的ID通常设为`IDC_WEBBROWSER`,以便后续代码中引用。 接着,为了加载指定的网页,我们需要在MFC的视图类中重写`OnCreate`方法,初始化WebBrowser控件,并调用`Navigate()`函数加载URL。例如: ```...
1. **代码检测**:在C#代码中,可以使用以下代码片段来检查WebBrowser控件的版本: ```csharp webBrowser1.ObjectForScripting = new ScriptingObject(); ((dynamic)webBrowser1.Document).parentWindow....
标题中的“一个使用WebBrowser控件获取Web数据的例子”指的是在编程中利用WebBrowser控件来从网页上抓取或交互数据的一种技术。WebBrowser控件通常被用于.NET框架(如Visual Basic或C#)中,它允许应用程序内嵌一个...
在.NET Framework中,`WebBrowser`控件是一个强大的工具,用于在Windows Forms或WPF应用程序中集成Web浏览功能。这个控件允许开发者在桌面应用中显示网页内容,并且可以与HTML进行交互,实现一些高级的功能。本文将...