自动注册MSComm控件

    MSComm通信控件具有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令的接口,可以用它创建全双工的、事件驱动的、高效实用的通信程序。这里将介绍如何把用MSComm这个ActiveX控件制作的Delphi程序运行在没有注册安装该控件的机器上。

    一、发布程序时可以用安装程序,我们这里不介绍,只谈谈如何在程序运行时注册安装MSComm控件。

    二、程序运行时自动注册

    完整程序如下:

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, Registry, shellapi; 
  6. type
  7.   TForm1 = class(TForm)
  8.     Button1: TButton;
  9.     procedure FormCreate(Sender: TObject);
  10.     procedure Button1Click(Sender: TObject);
  11.   private
  12.     { Private declarations }
  13.   public
  14.     { Public declarations }
  15.   end;
  16. var
  17.   Form1: TForm1;
  18. function InspectRegedit(): boolean;//检查注册表是否注册
  19. function InspectControl(): boolean;//检查文件和控件是否复制
  20. procedure CopyMSCommFile();//复制文件进系统文件夹
  21. function RegisterMSComm(): boolean;//向注册表中写注册信息
  22. implementation
  23. {$R *.dfm}
  24. function RegisterMSComm(): boolean;//向注册表中写注册信息
  25. Var
  26.   rs: Boolean;
  27.   Reg: TRegistry;//uses Registry
  28. begin
  29.   //try
  30.     rs:=false;
  31.     Reg:=TRegistry.Create;
  32.     Reg.RootKey:=HKEY_CLASSES_ROOT;//定位到注册表根键
  33.     if Reg.OpenKey('/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905'truethen
  34.     //尝试打开MSComm注册表项,如果不存在则创建该表项
  35.     begin
  36.       //写注册内容
  37.       Reg.WriteString('''kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun');
  38.     end;
  39.   //finally
  40.     Reg.CloseKey;//关闭定位的注册表根键
  41.     Reg.Free;//释放对象
  42.     Result:=rs;
  43.   //end;
  44. end;
  45. procedure CopyMSCommFile();//复制文件进系统文件夹
  46. Var
  47.   S_Path: Array [0..255of Char;
  48.   sp: String;
  49. begin
  50.   GetSystemDirectory(S_Path, 255);//系统文件夹路径
  51.   sp:=Trim(S_Path);
  52.   {copyfile(源文件地址,目标地址,是否覆盖);}
  53.   if Not(FileExists(sp + '/Mscomm.reg')) then //复制Mscomm.srg
  54.   begin
  55.     CopyFile(PChar('./MSComm控件/Mscomm.reg'), PChar(sp + '/Mscomm.reg'), false);
  56.   end;
  57.   if Not(FileExists(sp + '/Mscomm32.ocx')) then //复制Mscomm32.ocx
  58.   begin
  59.     CopyFile(PChar('./MSComm控件/Mscomm32.ocx'), PChar(sp + '/Mscomm32.ocx'), false);
  60.   end;
  61.   if Not(FileExists(sp + '/Mscomm32.dep')) then //复制Mscomm32.dep
  62.   begin
  63.     CopyFile(PChar('./MSComm控件/Mscomm32.dep'), PChar(sp + '/Mscomm32.dep'), false);
  64.   end;
  65.   //注册该Mscomm32.ocx控件
  66.   winexec(pchar('command.com   /c   regsvr32   ' + sp + '/Mscomm32.ocx'), sw_hide); //uses shellapi
  67. end;
  68. function InspectControl():boolean;//检查文件和控件是否复制
  69. Var
  70.   rs: Boolean;
  71.   S_Path: Array [0..255of Char;
  72.   sp: String;
  73. begin
  74.   try
  75.     rs:=false;
  76.     GetSystemDirectory(S_Path, 255);//系统文件夹路径
  77.      sp:=Trim(S_Path);
  78.     if (FileExists(sp + '/Mscomm.reg')) And //判断当前目录下是否有Mscomm.srg
  79.        (FileExists(sp + '/Mscomm32.ocx')) And //判断当前目录下是否有Mscomm32.ocx
  80.        (FileExists(sp + '/Mscomm32.dep')) then //判断当前目录下是否有Mscomm32.dep
  81.     begin
  82.       rs:=true;
  83.     end;
  84.   finally
  85.     Result:=rs;
  86.   end;
  87. end;
  88. function InspectRegedit():boolean;//检查注册表是否注册
  89. Var
  90.   rs: Boolean;
  91.   Reg: TRegistry;//uses Registry
  92. begin
  93.   try
  94.     rs:=false;
  95.     Reg:=TRegistry.Create;
  96.     Reg.RootKey:=HKEY_CLASSES_ROOT;//定位到注册表根键
  97.     if Reg.OpenKey('/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905'falsethen
  98.     //尝试打开MSComm注册表项
  99.       begin
  100.         if Reg.ReadString('') = 'kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun' then
  101.         //注册内容满足注册条件
  102.         begin
  103.           rs:=true;
  104.         end;
  105.       end
  106.     else
  107.       begin
  108.         Application.MessageBox('MSComm尚未在注册表中登记。''提示', MB_OK);
  109.       end;
  110.   finally
  111.     Reg.CloseKey;//关闭定位的注册表根键
  112.     Reg.Free;//释放对象
  113.     Result:=rs;
  114.   end;
  115. end;
  116. procedure TForm1.FormCreate(Sender: TObject);
  117. begin
  118.   Form1.Caption:=Application.Title;
  119. end;
  120. procedure TForm1.Button1Click(Sender: TObject);
  121. begin
  122.   if (Not Unit1.InspectControl) Or (Not Unit1.InspectControl) then
  123.     begin
  124.       if Application.MessageBox('MSComm尚未注册,请问需要自动注册安装吗?''提示', MB_YesNo+MB_ICONQUESTION) = IDYes then
  125.       begin
  126.         Unit1.CopyMSCommFile;//复制注册文件进系统文件夹
  127.         Unit1.RegisterMSComm;//登记注册表信息
  128.       end;
  129.     end
  130.   else
  131.     begin
  132.       Application.MessageBox('MSComm已经注册不需要重复注册。''提示', MB_OK+MB_ICONEXCLAMATION);
  133.     end;
  134. end;
  135. end.

程序运行时如图:


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值