第9卷第11期 2010年11月 软件导刊 Software Guide Vo1.9 No.11 Nov.2O10 基于Delphi的ActiveX控件设计 向 隅 (武汉铁路职业技术学院电子与电气工程系,湖北武汉430205) 摘 要:ActiveX控件具有与开发平台无关、可重用等特性,使用ActiveX控件可以节省开发者许多时间。通过一个实 例,系统、详尽地介绍了使用Delphi2009制作自定义ActiveX控件的过程。该控件制作难度不高,旨在说明 Delphi2009中ActiveX控件的设计方法 关键词:控件;ActiveX控件:Delphi 中图分类号:TP311.131 文献标识码:A 文章编号:1672—7800(2010)11—0041—03 0 引言 ActiveX Controls(ActiveX控件)是由微软和第三方开发商 开发的可重用的软件组件,使用ActiveX控件可以节省许多宝 贵的开发时间。由于ActiveX控件与开发平台无关性,即使用 一00000000h:0口0l 08 O0 53 7 6l 6E 6粤6i 72 64 20 qA 65 7 00000010h:20 4q哇2 00 01 00 O0 00 B5 6E D3 62 60 09 C2 5S 00000口20h:E9且9 67 72 0 3F D0 9C 7E 9F 90 FF 85 9且3l C5 00000030h:79 B且ED 30 BC DF CC 9D 63 D9 Eq C3 D3 q1 FB BA 00000040h:BC E Il7 66 EC 37 CC D9 9C F且57 C3 28 E6 82 2B 00000050h:I8且60 C5 09 7丑36 64 Er DF Bl E6 69 l3 43 5E 30 00000060h:lB1 33且5 FC 79 SB O3 28 7Cl 2A A3 EO 7C 99 05 13 00000D70h:9B FD BB 2B FB 77 q 8C e3 66 5r 95 F8 D0 89 2 图1无密码的Access数据库代码 000000O0h:O0 0i O0 00 53 7 61 6E 64 6i 7Z 6 20 q鱼6S 74 种软件开发工具开发的ActiveX控件可在另一种软件开发 00000010h:20 q 2 00 0l O0 O0 0O B5 6E 03 62 6O 09 C2 55 00000020h:E9 A9 67 72 40 3F 00 9C 7E 9F 90 FF 85 9A 3i C5 工具中使用,许多资深的程序员习惯将一些函数、过程等设计 成控件,以方便使用,提高开发效率 OOOO0030h:79 B且ED 30 BC DF CC 9D 63 D9 E4 C3 D3 qi FB 8且 000000q0h:BC El 6F 6 6 9S 37 FD D9 A5 FA 61 C3 1E E6 B3 2Bl AetiveX控件是采用运行DLL的方式来实现的,通常有一 个.OCX扩展名,它们可用在ActiveX控件的窗口中。制作Ac— tiveX控件的T具可以是微软的集成开发套件Visual Studio 2008,也可以是Delphi。本文结合获取(破解)Access(2000~ O0000050h:fBB 60 r5 09哇D 3 6 iC EF A6丑i D7 69 2且q3 68 32f 00000060h:I87 33 94 FC 48 5B 33 28I 且zA且3 E0 7C 99 05 13 00000070h:98 FD BB 2B FB 77 q 8C 83 66 5F 95 r8 DO 89 2 图2有密码的Access数据库代码 00000004h~00000012h存储的是Access数据库信息。内容 为”Standard Jet DB”。其中0000000dh~0000000fh的内容为” Jet”,若是Access2007数据库,则为”Ace”。由此可判断Access 2003)数据库密码的方法介绍Delphi2009中ActiveX控件的实 现方法 Delphi2009中自定义控件的实现主要分为以下几个阶段:① 数据库的类型。从00000042h开始,每隔一字节存储一个密码 信息,密码为对应位字节的异或运算,例如:00000042h位置的 内容分别为:17和6F,异域运算17 xor 6F结果为78h,其 ASCII值为”x” 建立控件原型;②添加属性;③设计控件功能代码;④形成Ac— tiveX控件(.OCX文件) 1 Access数据库密码分析 2自定义ActiveX控件设计 本实例只适用于Access2000~2003数据库,Access2007以 上的数据库由于密码方式不同,不适用于本文 假设创建的项目名称为access2000(即形成的ActiveX控 件的名称为access2000.OCX),CoClass Name为myaccess,其对 图1是使用UhraEdit编辑器打开的没有密码的Access 数据库的00000000h~00000070h代码,图2是对Access数 据库添加密码(密码:xy19661106xy19661106)后的 O0000000h~00000070h代码。Access数据库密码长度不超过 2O字符。 应的单元文件名为umyaecess.pas。 2.1建立控件原型 (1)启动delphi2009_File New 0ther_Active Library, 新建一个DLL项目: (2)将项目命名为Access2000,如图3所示: 作者简介:向隅(1966一),男,湖北仙桃人,硕士,武汉铁路职业技术学院电子与电气工程系副教授,研究方向为数学建模及网络数据库。 ・42・ 软件导刊 2010往= ,霸岫 赫} 襄 赫t。和m】一删 ,◆●▲ 姆争●一j 一《国 国 l ^ ‘‘_。 4 t“ }热 _I 一… … ID:{…一_^3 l :如rsl一1 0 l L口0 l 却 j 5tr’ : Ⅲe c: }H Stag…e×t: l№ 乜LL: 0 H咖F : 图3创建Access2000项目 (3)选择File-- ̄Save All命令,全部保存; (4)单击nle_New_+0ther_÷Active Form命令,打开“Ac. tiveX Form Wizard”对话框,将CoClass Name改为myaccess.如 图4所示: 图4 ”Active Form Wizard”对话框 (5)将对应的单元文件,保存为umyaccess.pas; (6)打开access2000.ridl文件,切换到design视图,选中 Imyaccess接口,删除其不必要的属性。 2.2设计控件功能代码 (1)打开umyaccess.pas文件,切换到Design视图,添加3 个Label控件、一个Edit控件、两个Button控件,控件设置如图 5所示: 件舞: :; i 硝--:固 : 图5控件设计 此时控件框架如下所示: unit umyaccess; {¥WARN SYMBOL_PLATFORM OFF} interface uses Windows,Messages,SysUtils,Classes,Graphics,Con- trois,Forms,Dialogs,ActiveX,AxCtrls,aecess20OO_TLB,Std- Vcl,ExtCtds,StdCtrls; type Tmyaccess=class(TActiveForm,Imyaccess) Label1:TLabel; Label2:TLabel; Editl:TEdit; Label3:TLabel; Button1:TButton; Button2:TButton; OpenDialogl:TOpenDialog; procedure Butt0n1Click(Sender:TObject); procedure Button2CIick(Sender:TOhject); private {Private declarations t msg:widestirng; protected {Protected declarations} public {Public declarations} procedure Initialize;override; end; implementation uses ComObj,ComServ; (2)编写控件功能代码 //定义全局数组变量 implementation uses ComObj,ComServ; {¥R★.DFM} {Tmyaccess} Var incode2003:array[0..105]of byte=(¥00,So1,¥oo,¥oo,¥53, ¥74,¥61,¥6E,¥64,¥61,¥72,¥64,¥20,¥4A,¥65,¥74,¥20,¥44, ¥42,¥oo,¥01,¥00,¥o0,¥0o,¥B5,¥6E,¥03,¥62,¥60,¥O9,¥C2, ¥55,¥E9,¥A9,¥67,¥72,¥40,¥3F,¥oo,¥9C,¥7E,¥9F,¥90,¥FF, ¥85,¥9A,¥31,¥C5,¥79,SBA,SED,¥30,¥BC,¥DF,¥cc,¥9D, ¥63,¥D9,¥E4,¥C3,¥D3,¥41,¥FB,¥8A,SBC,¥4E,¥08,¥66, ¥EC,¥37,¥D3,¥D9,¥9C,¥FA,¥48,¥C3,¥28,¥E6,¥9D,¥2B, ¥8A,¥60,¥DA,¥09,¥7B,¥36,¥7B,¥EF,¥DF,¥B1,¥F9,¥69, ¥13,¥43,¥41,¥32,¥B1,¥33,SBA,¥FC,¥79,¥5B,¥1c,¥28, ¥7C,¥2A);//Access2003固定码 //”浏览”按钮代码如下: procedure Tmyaccess.Button1Click(Sender:TObject); begin //设置文件过滤器 opendialog1.Filter:='access2003数据库(-k.mdb)l★.mdb ; if opendialog1.Execute then edit1.Text:=opendialog1.FileName; end; //”获取”按钮代码如下: procedure Tmyaccess.Button2Click(Sender:TObject); Var MS:TFileStream: i:integer; mybuffer:array[0..105]of byte; strl:string; begin strl:=~: if not EileExists(trim(edit1.Text))then strl:= 指定的文件不存在 else begin //创建数据流 ms:=tiflestream.Create(t矗m(edit1.Text),fmOpenReadWrite); 第11期 向 隅:基于Delphi的ActiveX控件设计 ・43‘ //读取数据流 ms.Read(mybuffer[0],105); i:=66; //求密码 while i<105 do begin if incode2003[i]=mybuffer[i]then break else strl:=strl+char(ineode2003[i]xor mybuffer[i_】); i:=i+2: end; ms.Free; end; label3.Caption:=strl; end; 2.3形成ActiveX控件(即生成access2000.OCX) 选择主菜单下的Project--+Compile access2000(或按Ctrl+ F9组合键)菜单项,对access2000.dpr进行编译,生成ac— cess2000.oex文件。 3注册ActiveX控件 Windows中使用ActiveX控件前须注册该控件,注册方法: 执行命令regsvr32 access2000.OCX便可完成注册:若ac— tess2000.OOX文件不在当前目录,一 则需完整的路径。 4使用ActiveX控件 4.1安装ActiveX控件 ActiveX控件不是Delphi2009中的标准控件,若在De1. phi2009中使用.还需安装该控件。Delphi2009中安装ActiveX 控件的步骤如下: (1)启动Delphi2009: (2)选择File—New Package—Delphi for Win32菜单命令, 新建一个项目: (3)选择Component菜单下的Import Component命令,打 开Import Component对话框。选中Import ActiveX Control单选 项,单击“Next”按钮,弹出“Registered ActiveX Controls”,在对话 框中选择“access2000.OCX”.如图6所示: 图6添加”ActiveX Control”对话框 (4)单击“Next”按钮,弹出控件的Unit等存放位置对话框, 选中“Generate component wrappers”复选框,单击“Next”按钮, 弹出“Create Unit”对话框,如图7所示: 一 . ~n 图7”Create Unit”对话框 (5)选择“Add Unit to package1.dproj project”单选项,单击 “Finish”按钮,完成安装; (6)在项目管理器中用鼠标右击Package,从弹出的快捷菜 单中选择“Install”命令,完成Package的安装; Delphi2009中添加access2000.OCX控件成功后就可以在 Delphi2009窗口添加该控件了,该控件位于组件面板的Ac— tiveX控件类中.控件名为Tmyaceess。 4.2使用ActiveX控件 (1)启动Delphi2009,新建一个VCL Forms Application窗 体。 (2)在窗体上添加Tmyaccess控件(该控件位于ActiveX面 板中) (3)运行该项目,效果如图8所示: 』I文j : …dga6【 61 061 ̄.ym1d晰b…11 ∞圆 一圜 乙_。 警誊。 。 。 。誊。 ; 。。 。。 ; 图8案例效果 5结束语 本文通过一个具体的实例,介绍了Delphi2009中ActiveX 控件的设计、形成、注册、安装及应用。ActiveX控件具有许多特 性。在应用程序中,将一些典型的过程和函数设计成ActiveX 控件,在不同的开发环境中使用,可提高项目的开发效率。另 外,在设计控件接口时,可为控件添加属性,并给属性添加代 码,这样在应用程序中可使用控件的属性。 参考文献 [1] 邓清闯.Delphi自定义控件设计[J].电脑编程技巧与维护.2009(12). [2] Steve Teixeira,Xavier Pacheco.Delphi6开发人员指南[M].龙劲 松,王瑜,谢尚书,译.北京:机械工业出版社,2003. [3] 郑阿奇.Delphi实用教程(第2版)[M].北京:电子工业出版社, 2008. [4]路遥.PDF文件阅读器[J].电脑编程技巧与维护,2007(7). (责任编辑:余晓)