1. 程式人生 > >自動註冊MSComm控制元件

自動註冊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.

程式執行時如圖: