如何开发ActiveX控件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何开发ActiveX控件相关的知识,希望对你有一定的参考价值。
ActiveX技术虽然是一项古老的技术,但是却有着广泛的应用,支付宝的密码输入控件,各大银行的密码输入控件,网页聊天室中的截屏功能,网页播放器中的p2p播放...甚至Flash,Silverlight等等,在IE中都表现为ActiveX。虽然C#也能开发"用于网页的com应用",能达到类似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里测试一下:
<OBJECT ID='x' name='x' CLASSID='CLSID:52D17094-0687-4A2F-B2DB-30F3189AC659' align=center hspace=0 vspace=0 ></OBJECT>
<script type='text/javascript'>
var x = document.getElementById("x");
alert(x.Msg);
</script>
关于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.Edit1.Text := _msg;
end;
即设置Msg属性时,同时也把值显示在文本框里,以便等会儿我们好测试在js中给activeX属性赋值的效果
ok了,再来测试一下,编译一下,如果通不过,请先运行
regsvr32 C:\Users\jimmy.yang\Desktop\Delphi_activex\MyActiveX\MyActiveX.ocx /u
将刚才注册的ocx反注册,同时关掉浏览器,不然该ocx文件一直被占用,无法更新.
修改一下html的代码:
<OBJECT ID='x' name='x' CLASSID='CLSID:52D17094-0687-4A2F-B2DB-30F3189AC659' align=center hspace=0 vspace=0 ></OBJECT>
<hr />
<input type='button' value='显示Msg属性的值' onclick='ShowMsg()'/>
<input type='button' value='设置Msg属性的值' onclick='SetMsg()'/>
<script type='text/JavaScript'>
var x = document.getElementById("x");
var ShowMsg = function()
alert(x.Msg);
var SetMsg = function()
x.Msg = 'js传过来的值';
</script> 参考技术A 常用的是基于c++平台开发ocx控件
visual stdio 开发ActiveX控件基本教程
比较少人会专门开发控件,但是有时候工作需要,需要开发简单的控件,控件技术
因为要和浏览器交互,所以有些需要注意的点,此文为需要开发简单控件准备,基本
满足基本的功能要求。包含必要的工程设置,方法的创建和调用,属性的添加和使用,
事件的添加,以及事件的使用,和JS的交互示例。希望对你有用。
1. 以管理员权限打开Visual Stadio并创建MFC ACTIVEX 工程。
以管理员权限打开是因为编译调试时,会在系统注册这个控件,需要管理员权限
2. 设置调试环境。以免无法进行调试。
3. 设置静态库使用MFC
4. 在类视图中,添加方法
5. 在类视图中添加属性,如上图选择属性。
属性的用法,
- 属性可以在初始化的时候设置。如下图JS。
2. 这样设置的属性,需要在代码中持久化
3. 属性更改后。控件中会得到通知。
响应函数中在值改变时,会得到通知。
6 . 为了方便调试,可以增加控制台界面,将调试信息输出到控制台
首先,在App类中,添加如下代码。就可以调用 printf 输出信息到控制台,调试非常方便。
7. 添加事件,和JS交互,有些事件处理事件比较长,可以通过事件通知的形式,通知JS更新状态。还是在类视图,这次选择CTRL类,右击菜单,如下:
事件函数名称可以自定义,也可以用已有的几个事件。
在完成添加后,会自动添加如下代码。也可能是在类的定义里,
在添加完事件后,在JS中,可以添加事件处理,如下
8. 因为是Unicode编码方式,所以需要用到wide转mutil字符的函数,如下,
9. 因为JS和ActiveX交互,地址空间是不一样的,如果ActiveX中申请的内存需要返回到JS中,需要用Sys接口申请内存,如下:
10. 对于mutil和wide char 的转换,还有一种方式就是使用CString 构造。
CString 有传muti char的构造函数。实现自动转化,你就说牛不牛逼,意不意外。
11. 关于运行的时候提示找不到dll,一般如果dll本身没问题的话,肯定是你引用的路径由问题。排除方法是,在调用loadLibrary之前调用 GetCurrentFolder(这个函数不能直接调,我只是想说,你可以找个系统函数获得当前执行路径),如果这个路径下没有dll,那肯定是要报错的嘛!
好了,先记录这么多,后续有高级特性再添加。
以上是关于如何开发ActiveX控件的主要内容,如果未能解决你的问题,请参考以下文章
双击ActiveX控件时如何禁用Visual Basic对话框
如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件