📄 main.pas
字号:
unit Main;
{版权所有 枫叶在线 HTTP://WWW.SKYGZ.COM SKYGZ@QQ.COM 风铃夜思雨}
interface
uses
Windows, SysUtils, Forms, ComCtrls,
Classes, Controls, StdCtrls, IniFiles, Plugins;
const
MaxPlugin = 50; //最多可加载多少个插件
type
TFrmMain = class(TForm)
CmdStart: TButton;
CmdStop: TButton;
CmdConfig: TButton;
CmdKill: TButton;
CmdAbout: TButton;
ListView1: TListView;
procedure FormDestroy(Sender: TObject);
procedure CmdConfigClick(Sender: TObject);
procedure CmdStartClick(Sender: TObject);
procedure CmdStopClick(Sender: TObject);
procedure CmdKillClick(Sender: TObject);
procedure CmdAboutClick(Sender: TObject);
procedure ListView1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Ini: TIniFile;
DllValue: Integer; //已加载DLL的数目
LibHandle: array[0..MaxPlugin] of HMODULE;
Plugin: array[0..MaxPlugin] of PluginInfoType;
PluginModule: array[0..MaxPlugin] of PPluginModule;
procedure SetButton(Bool: Boolean);
procedure LoadPlugins;
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
implementation
{$R *.dfm}
procedure TFrmMain.SetButton(Bool: Boolean);
var i: Integer;
begin
for i := 0 to componentcount - 1 do
if (components[i] is TButton) then TButton(components[i]).Enabled := Bool;
end;
procedure TFrmMain.LoadPlugins;
var
SR: TSearchRec;
Path: string;
Found: Integer;
List: TListItem;
begin
DllValue := 0;
Path := ExtractFilePath(ParamStr(0)) + 'Plugin\';
try
Found := FindFirst(Path + 'In_*.dll', 0, SR);
while Found = 0 do
begin
LibHandle[DllValue] := LoadLibrary(PChar(Path + SR.Name));
if LibHandle[DllValue] <> 0 then
begin
Plugin[DllValue] := GetProcAddress(LibHandle[DllValue], 'PluginInfo');
if Assigned(Plugin[DllValue]) then
begin
PluginModule[DllValue] := Plugin[DllValue].Module;
PluginModule[DllValue].Exeinfo(handle, PChar(ParamStr(0)));
PluginModule[DllValue].Initialize(PluginModule[DllValue]);
List := ListView1.Items.Add;
List.Caption := Plugin[DllValue].Description + ' ' + Plugin[DllValue].Version;
List.SubItems.Add(SR.Name);
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini');
List.Checked := Ini.ReadBool('Plugin', UpperCase(SR.Name), false);
if List.Checked then PluginModule[DllValue].Start(PluginModule[DllValue]);
Ini.Free;
end;
end;
DllValue := DllValue + 1;
Found := FindNext(SR);
end;
finally
FindClose(SR);
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
var i: Integer;
begin
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini');
for i := 0 to ListView1.Items.Count - 1 do
Ini.WriteBool('Plugin', UpperCase(ListView1.Items[i].SubItems.Strings[0]), ListView1.Items[i].Checked);
Ini.Free;
for i := 0 to DllValue - 1 do
begin
if LibHandle[i] <> 0 then
begin
PluginModule[i].Terminate(PluginModule[i]);
FreeLibrary(LibHandle[i]);
end;
end;
end;
procedure TFrmMain.CmdConfigClick(Sender: TObject);
var i: Integer;
begin
i := ListView1.ItemIndex;
if i = -1 then Exit;
PluginModule[i].Config(PluginModule[i]);
end;
procedure TFrmMain.CmdStartClick(Sender: TObject);
var i: Integer;
begin
i := ListView1.ItemIndex;
if i = -1 then Exit;
PluginModule[i].Start(PluginModule[i]);
end;
procedure TFrmMain.CmdStopClick(Sender: TObject);
var i: Integer;
begin
i := ListView1.ItemIndex;
if i = -1 then Exit;
PluginModule[i].stop(PluginModule[i]);
end;
procedure TFrmMain.CmdKillClick(Sender: TObject);
var TmpStr: string;
i: Integer;
begin
i := ListView1.ItemIndex;
if i = -1 then Exit;
if MessageBox(handle, PChar('确认要卸载 ' + ListView1.Items[i].SubItems.Strings[0] + ' 插件吗?' + #13#10 + '要重启程序才能完成卸载。'), '提示', MB_ICONQUESTION or MB_OKCANCEL or MB_DEFBUTTON2) = IDOK then
begin
TmpStr := PluginModule[i].DllPath;
FreeLibrary(LibHandle[i]);
LibHandle[i] := 0;
DeleteFile(TmpStr);
Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini');
Ini.DeleteKey('Plugin', UpperCase(ExtractFileName(TmpStr)));
Ini.Free;
application.Terminate;
end;
end;
procedure TFrmMain.CmdAboutClick(Sender: TObject);
var i: Integer;
begin
i := ListView1.ItemIndex;
if i = -1 then Exit;
PluginModule[i].about(PluginModule[i]);
end;
procedure TFrmMain.ListView1Click(Sender: TObject);
begin
if ListView1.ItemIndex = -1 then SetButton(false) else SetButton(true);
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
LoadPlugins;
SetButton(false);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -