Delphi中挂接IWebBrowser2的自动化事件
来源:互联网 发布:超星泛雅网络课程 编辑:程序博客网 时间:2024/06/05 08:50
delphi
it
分类: 软件设计OLE自动化的控制方有时要从受控方接收事件通知。比如WebBrowser的OnNavagiteComplete,OnDocumentComplete等事件。OLE对象需要实现IConnectionPointContaine
IEnumConnections = interface
end;
{ IConnectionPoint interface }
{$EXTERNALSYM IConnectionPoint}
IConnectionPoint = interface
end;
{ IConnectionPointContaine
{$EXTERNALSYM IConnectionPointContaine
IConnectionPointContaine
end;
{ IEnumConnectionPoints interface }
{$EXTERNALSYM IEnumConnectionPoints}
IEnumConnectionPoints = interface
end;
需要接收自动化事件通知时,可以用InterfaceConnect注册:
procedure InterfaceConnect(const Source: IUnknown; const IID: TGUID;
const Sink: IUnknown; var Connection: Longint);
var
CPC: IConnectionPointContaine
CP: IConnectionPoint;
begin
Connection := 0;
if Source.QueryInterface(IConnectionPointContaine
end;
其中Source为受控方OLE对象的接口。IID是事件连接点的GUID。一个OLE对象可能有多个事件连接点,比如IWebBrowser2有个事件连接点为:
WebBrowserEventId : TGUID='{34A715A0-6587-11D0-924A-0020AFC7AC4D}';
Sink就是接收事件通知的对象的接口了,这个对象至少需要实现IUnknown和IDispatch接口。当事件触发时,事件接收者的Invoke方法会被调用:
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;Flags: Word; var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult; virtual; stdcall;
DispID为事件的编号,可以从自动化对象的事件接口的声明里找到这个编号。比如IWebBrowser的事件声明
end;
方法声明后面dispid数字就是DispID。所以如果接收到IWebBrowser2的DispID为259的通知,就表明DocumentComplete事件发生了。
Invoke的Params变参包含特定事件的附加信息,或者叫做事件参数。他是一个TDispParams结构:
tagDISPPARAMS = record
end;
对于IWebBrowser2的DocumentComplelte事件,rgvarg[1]就是发出此事件通知的IWebBrowser2接口。请注意,一个内嵌框架下载完成也会触发DocumentComplelte事件,要判断是否整个网页都下载完毕了可以用以下方法(TEventDispatch是我写的一个接收自动化事件通知的类):
function TEventDispatch.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
var
vPDispParams: PDispParams;
ib:IWebBrowser2;
begin
vPDispParams := PDispParams(@Params);
if DispID=259 then
begin
function TEventDispatch.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
var
vPDispParams: PDispParams;
ib:IWebBrowser2;
begin
vPDispParams := PDispParams(@Params);
if DispID=259 then
begin
end;
Result:= S_OK;
end;
本文来自Delphi之窗,原文地址:http://www.52delphi.com/list.asp?ID=1208
- Delphi中挂接IWebBrowser2的自动化事件
- 类内实现MFC/VC shdocvw IWebbrowser2的OnDocumentComplete等事件响应
- Delphi事件的广播
- Delphi事件的广播
- Delphi 窗体的事件
- Delphi事件的广播
- Delphi 窗体的事件
- Delphi的DataSource事件
- 利用IWebBrowser2的IWebBrowser2::get_Document得doc对象
- 取得IWebBrowser2的窗体句柄
- Delphi中COM自动化对象中使用事件
- Delphi通过窗口句柄获得IWebBrowser2接口源码
- Delphi通过IE窗口句柄获取网页接口(IWebBrowser2)
- Delphi事件的广播2
- Delphi 自定义事件的例子
- [转]Delphi窗体的事件
- Delphi中窗体的事件
- 获取IWebBrowser2指针的方法(一)
- LeetCode Implement strStr(kmp或者BM)
- UI基础之--UILabel
- solr
- Cross-Orign Resource Sharing简介
- 关于Android 6.0 调用 要求使用权限代码报红色问题
- Delphi中挂接IWebBrowser2的自动化事件
- JAVA IO
- 解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
- 图片像素与色彩模式
- ```C#学习(五)···
- JavaWeb学习总结(十七)——JSP中的九个内置对象
- voc-release5在window下编译总结
- JAVA中String的“==”和equals()浅析
- 在Rxjava+Retrofit 2中检查网络连接和显示加载框