自動註冊MSComm控制元件
阿新 • • 發佈:2019-01-06
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.
程式執行時如圖: