Delphi 快速开发原生ActiveX控件
ActiveX
技术虽然是一项古老的技术,但是却有着广泛的应用,支付宝的密码输入控件,各大银 行的密码输入控件,网页聊天室中的截屏功能,网页播放器中的p2p播放...甚至 Flash,Silverlight等等, 在IE中都表现为ActiveX。 虽然c#也能开发"用于网页的com应用", 能达到类似ActiveX的效果(可参见c#中开发ActiveX的
学习笔记), 但是有一个要命的问题是 必须得安装几百M的.net framework框架,如果仅仅为了安全的输入一个密码,而要用户下 载几百M的安装
程序,这是很多人不能接受的,delphi做为win32下的原生开发工具,能很 好的支持微软各种"古老"的经典技术。(再做点小广告:delphi的kyrix版本还能编译跨平台的 应用哦!) ok,开工吧: 开发工具:推荐用delphi 2010(d7也可以,不过添加属性,方法等过程要手动,稍微麻烦点) 1.启用delphi2010-->File->New->Other-->Active Library
2.项目命名为MyActiveX
3.File-->Save
All 全部保存 实际上这样就能编译了,不过只是空的dll 4.File-->New-->Other-->Active Form
改名为MyForm
将对应的单元文件,保存为
UMyForm.pas
5.打开MyAcitveX.ridl文件,切换到design视图,选中IMyForm接口,右击New-->Property
添加一个属性Msg
将
Msg属性的Type改为BSTR 即WideString类型
完了之后,点击工具栏中的Refresh Implementation(即上图中工具栏中圈起来的部分)--这 一步很重要,点击之后,它将自动生成属性Msg对应的声明和实现代码模板 6.打开UMyForm.pas--即ActiveForm对应的单元, 找到Set_Msg以及Get_Msg的实现部 分,补充代码如下:
function TMyForm.Get_Msg: WideString; begin result:=_msg; end; procedure TMyForm.Set_Msg(const Value: WideString); begin _msg := value; end;
当然TMyForm的private部分,得先加一个私有成员
type TMyForm = class(TActiveForm, IMyForm) private { Private declarations } _msg:WideString; ...
这样我们就为即将生成的ActiveX控件, 添加了一个字符串类型的属性Msg,下面来测试一下: 7.编译项目,会生成一个MyActiveX.ocx,在运行栏里输入
regsvr32
C:\Users\jimmy.yang\Desktop\delphi_activex\MyActiveX\MyActiveX.ocx 注:这里ocx的路径,请各位根据自己的实际路径修改 这样就完成了ocx的注册。 8.放到html里测试一下:
代码
关于CLSID在哪里查看,打开:MyActiveX_TLB.pas文件,定位到下面这里:
代码 const // TypeLibrary Major and minor versions MyActiveXMajorVersion = 1; MyActiveXMinorVersion = 0; LIBID_MyActiveX: TGUID = '{49138437-8265-4B1A-9EAE-D0F615D68464}'; IID_IMyForm: TGUID = '{54A20855-29A3-4C92-85DE-A419DA457C7A}'; DIID_IMyFormEvents: TGUID = '{60BBC967-E1E6-4E98-BAE5-776BFD06E9CC}'; CLASS_MyForm: TGUID = '{52D17094-0687-4A2F-B2DB-30F3189AC659}';
其中 CLASS_MyForm: TGUID对应的就是ClassID 运行后,除了弹出一个空白的警告框,暂时看不到其它:)(可不就是这样么?Msg属性没给任 何初始值,当然是空字符串,所以弹出一个空的警告框是正常的) 9.我们再来添加一些控件和方法,以验证刚才设置的属性确实有效 在MyForm上添加一个文件框,一个按钮
按钮的事件如下:
procedure TMyForm.Button1Click(Sender: TObject); begin _msg:= self.Edit1.Text; end;
即把文本框的值赋给属性Msg
再继续定位到
Set_Msg,略做修改
procedure TMyForm.Set_Msg(const Value: WideString); begin _msg := value; self.Ed