Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 5619|回复: 2

lazarus中使用ActiveX

[复制链接]

该用户从未签到

发表于 2014-1-2 15:45:43 | 显示全部楼层 |阅读模式
首先,我要说下,lazarus有个包叫lazActiveX,自带一个控件,据群友说,感觉不错,我也没仔细看,我使用另一种方法。我的环境是Codetyphon。
1.lazarus的ide中,“工具”菜单---Import Type Library;导入一个ActiveX控件,网上有教程,最后反正是为了得到xxx_TLB.pas;我导入的是WebBrowser,最终得到SHDocVw_1_1_TLB.pas;
2.在单元内引用ActiveX和SHDocVw_1_1_TLB,当然,你得把SHDocVw_1_1_TLB导入进工程;
3.xxx:=CreateOleObject('InternetExplorer.Application');   windows.SetParent(xxx.HWND,Form1.Handle);
这两句,你懂得,对吧?
4.最主要的是挂载回调函数,首先,引用我提供的“eventsink.pas”(我大多抄的别人的,有点小问题,修改了下。)
私有域申明“EventSink : TEventSink;”
EventSink := TEventSink.Create(Self);
EventSink.OnInvoke := @EventSinkInvoke;
EventSink.Connect(xxx, DWebBrowserEvents2);
EventSinkInvoke这个函数原型为
procedure EventSinkInvoke(Sender: TObject; DispID: Integer;       const IID: TGUID; LocaleID: Integer; Flags: Word;
       Params: tagDISPPARAMS; VarResult, ExcepInfo, ArgErr: Pointer);
DWebBrowserEvents2接口在SHDocVw_1_1_TLB中,浏览的接口是IWebBrowser2,事件的接口是DWebBrowserEvents2,至于为什么,说来话长,反正就是还有个1,是老版本,这个是新的,区分事件的,是那个命名习惯,这东西得讲微软的历史,我就不讲了。
但是我们必须打开SHDocVw_1_1_TLB,找到DWebBrowserEvents2,然后看你想挂那个事件,DWebBrowserEvents2里面包含所有的事件,注意dispid,我准备截获NewWindow2,他的是251;
5.实现EventSinkInvoke函数,
case dispid of
251:自己实现的回调函数,类型当然和SHDocVw_1_1_TLB中的那个要一样了,前面那个251,你肯定还没忘,对吧
end;
这里我啰嗦一句,我看的教程上说,Params是顺序放参数的,但是我在lazarus上发现,是反序的,至于为什么,我也不知道。有知道的兄弟,可以来拍砖。要是没说清楚,你自己看代码吧。
我在一个其他兄弟的代码上改的,你可以这样认为,代码风格写的好的,是我写的,不好的,都是他写。。。。。。。
[url=]mylazaruswebbrowser.rar[/url]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x

评分

参与人数 1金钱 +8 收起 理由
bugxiong + 8 Lazarus有你更精彩

查看全部评分

回复

使用道具 举报

该用户从未签到

发表于 2014-1-3 08:56:19 | 显示全部楼层
我就像是一块砖,那里需要那里搬

回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2014-6-13 18:27:03 | 显示全部楼层
我是小小一块砖
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 01:06 , Processed in 0.082922 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表