MSComm通信控件具有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令的接口,可以用它创建全双工的、事件驱动的、高效实用的通信程序。这里将介绍如何把用MSComm这个ActiveX控件制作的Delphi程序运行在没有注册安装该控件的机器上。
一、发布程序时可以用安装程序,我们这里不介绍,只谈谈如何在程序运行时注册安装MSComm控件。
二、程序运行时自动注册
完整程序如下:
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Registry, shellapi;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- function InspectRegedit(): boolean;//检查注册表是否注册
- function InspectControl(): boolean;//检查文件和控件是否复制
- procedure CopyMSCommFile();//复制文件进系统文件夹
- function RegisterMSComm(): boolean;//向注册表中写注册信息
- implementation
- {$R *.dfm}
- function RegisterMSComm(): boolean;//向注册表中写注册信息
- Var
- rs: Boolean;
- Reg: TRegistry;//uses Registry
- begin
- //try
- rs:=false;
- Reg:=TRegistry.Create;
- Reg.RootKey:=HKEY_CLASSES_ROOT;//定位到注册表根键
- if Reg.OpenKey('/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905', true) then
- //尝试打开MSComm注册表项,如果不存在则创建该表项
- begin
- //写注册内容
- Reg.WriteString('', 'kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun');
- end;
- //finally
- Reg.CloseKey;//关闭定位的注册表根键
- Reg.Free;//释放对象
- Result:=rs;
- //end;
- end;
- procedure CopyMSCommFile();//复制文件进系统文件夹
- Var
- S_Path: Array [0..255] of Char;
- sp: String;
- begin
- GetSystemDirectory(S_Path, 255);//系统文件夹路径
- sp:=Trim(S_Path);
- {copyfile(源文件地址,目标地址,是否覆盖);}
- if Not(FileExists(sp + '/Mscomm.reg')) then //复制Mscomm.srg
- begin
- CopyFile(PChar('./MSComm控件/Mscomm.reg'), PChar(sp + '/Mscomm.reg'), false);
- end;
- if Not(FileExists(sp + '/Mscomm32.ocx')) then //复制Mscomm32.ocx
- begin
- CopyFile(PChar('./MSComm控件/Mscomm32.ocx'), PChar(sp + '/Mscomm32.ocx'), false);
- end;
- if Not(FileExists(sp + '/Mscomm32.dep')) then //复制Mscomm32.dep
- begin
- CopyFile(PChar('./MSComm控件/Mscomm32.dep'), PChar(sp + '/Mscomm32.dep'), false);
- end;
- //注册该Mscomm32.ocx控件
- winexec(pchar('command.com /c regsvr32 ' + sp + '/Mscomm32.ocx'), sw_hide); //uses shellapi
- end;
- function InspectControl():boolean;//检查文件和控件是否复制
- Var
- rs: Boolean;
- S_Path: Array [0..255] of Char;
- sp: String;
- begin
- try
- rs:=false;
- GetSystemDirectory(S_Path, 255);//系统文件夹路径
- sp:=Trim(S_Path);
- if (FileExists(sp + '/Mscomm.reg')) And //判断当前目录下是否有Mscomm.srg
- (FileExists(sp + '/Mscomm32.ocx')) And //判断当前目录下是否有Mscomm32.ocx
- (FileExists(sp + '/Mscomm32.dep')) then //判断当前目录下是否有Mscomm32.dep
- begin
- rs:=true;
- end;
- finally
- Result:=rs;
- end;
- end;
- function InspectRegedit():boolean;//检查注册表是否注册
- Var
- rs: Boolean;
- Reg: TRegistry;//uses Registry
- begin
- try
- rs:=false;
- Reg:=TRegistry.Create;
- Reg.RootKey:=HKEY_CLASSES_ROOT;//定位到注册表根键
- if Reg.OpenKey('/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905', false) then
- //尝试打开MSComm注册表项
- begin
- if Reg.ReadString('') = 'kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun' then
- //注册内容满足注册条件
- begin
- rs:=true;
- end;
- end
- else
- begin
- Application.MessageBox('MSComm尚未在注册表中登记。', '提示', MB_OK);
- end;
- finally
- Reg.CloseKey;//关闭定位的注册表根键
- Reg.Free;//释放对象
- Result:=rs;
- end;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- Form1.Caption:=Application.Title;
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- if (Not Unit1.InspectControl) Or (Not Unit1.InspectControl) then
- begin
- if Application.MessageBox('MSComm尚未注册,请问需要自动注册安装吗?', '提示', MB_YesNo+MB_ICONQUESTION) = IDYes then
- begin
- Unit1.CopyMSCommFile;//复制注册文件进系统文件夹
- Unit1.RegisterMSComm;//登记注册表信息
- end;
- end
- else
- begin
- Application.MessageBox('MSComm已经注册不需要重复注册。', '提示', MB_OK+MB_ICONEXCLAMATION);
- end;
- end;
- end.
程序运行时如图: