⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 用Delphi实现Dll插件的方式
💻 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 + -