如何开发ActiveX控件

 我来答
huanglenzhi
推荐于2017-09-22 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517203
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
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>
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式