如何开发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. 在类视图中添加属性,如上图选择属性。

属性的用法,

  1. 属性可以在初始化的时候设置。如下图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控件的主要内容,如果未能解决你的问题,请参考以下文章

使用C#开发ActiveX控件

双击ActiveX控件时如何禁用Visual Basic对话框

如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件

Visual Basic 6 ActiveX 控件

如何将 MFC ActiveX 控件添加到现有的 activex 项目

C++开发ActiveX控件相关事项