Mainfrm.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit Mainfrm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, Menus;
  6. type
  7.   TfrmMain = class(TForm)
  8.     MainMenu1: TMainMenu;
  9.     N1: TMenuItem;
  10.     N2: TMenuItem;
  11.     N_Plugins: TMenuItem;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormDestroy(Sender: TObject);
  14.   private
  15.     procedure LoadPlugIns; //初始化插件 ,也就装载插件,并在菜单提供调用
  16.     procedure PlugInsClick(Sender: TObject); //插件菜单点击事件
  17.     procedure FreePlugIns; //释放插件
  18.   public
  19.     { Public declarations }
  20.   end;
  21. var
  22.   frmMain: TfrmMain;
  23. implementation
  24. {$R *.dfm}
  25. type
  26.   //定义接口函数类型
  27.   TShowDLLForm = function(AHandle: THandle; ACaption: string): Boolean; Stdcall;
  28.   TGetCaption = function: Pchar; StdCall;
  29.   EDLLLoadError = class(Exception);
  30.   //定义TTestPlugIn类,存放caption,Address,call等信息
  31.   TTestPlugIn = class
  32.     Caption: string;//存取加载后,GetCaption返回的标题
  33.     Address: THandle; //存取加载DLL的句柄
  34.     Call: Pointer; //存取ShowDLLForm函数句柄
  35.   end;
  36. var
  37.   ShowDllForm: TShowDllForm; //声明接口函数类型
  38.   Plugins: TList; //存放每一个DLL加载后的相关信息
  39.   StopSearch: Boolean;
  40. //查找文件,并存于Files中
  41. procedure SearchFileExt(const Dir, Ext: string; Files: TStrings);
  42. var
  43.   Found: TSearchRec;
  44.   Sub: string;
  45.   i: Integer;
  46.   Dirs: TStrings;
  47.   Finished: Integer;
  48. begin
  49.   StopSearch := False;
  50.   Dirs := TStringList.Create;
  51.   Finished := FindFirst(Dir + '*.*', 63, Found);
  52.   while (Finished = 0) and not (StopSearch) do
  53.   begin
  54.     if (Found.Name[1] <> '.') then
  55.     begin
  56.       if (Found.Attr and faDirectory = faDirectory) then
  57.         Dirs.Add(Dir + Found.Name) //Add to the directories list.
  58.       else
  59.         if Pos(UpperCase(Ext), UpperCase(Found.Name)) > 0 then
  60.           Files.Add(Dir + Found.Name);
  61.     end;
  62.     Finished := FindNext(Found);
  63.   end;
  64.   FindClose(Found);
  65.   if not StopSearch then
  66.     for i := 0 to Dirs.Count - 1 do
  67.       SearchFileExt(Dirs[i], Ext, Files);
  68.   Dirs.Free;
  69. end;
  70. //初始化插件 ,也就装载插件,并在菜单提供调用
  71. procedure TfrmMain.LoadPlugIns;
  72. var
  73.   Files: TStrings;
  74.   i: Integer;
  75.   TestPlugIn: TTestPlugIn;
  76.   NewMenu: TMenuItem;
  77.   GetCaption: TGetCaption;
  78. begin
  79.   Files := TStringList.Create;
  80.   Plugins := TList.Create;
  81.   //查找指定目录下的.dll文件,并存于Files对象中
  82.   SearchFileExt(ExtractFilepath(Application.Exename), '.dll', Files);
  83.   //加载查找到的DLL
  84.   for i := 0 to Files.Count - 1 do
  85.   begin
  86.     TestPlugIn := TTestPlugIn.Create;
  87.     TestPlugIn.Address := LoadLibrary(PChar(Files[i]));
  88.     if TestPlugIn.Address = 0 then
  89.       raise EDLLLoadError.Create('装载' + PChar(Files[i]) + '失败');
  90.     try
  91.       @GetCaption := GetProcAddress(TestPlugIn.Address, 'GetCaption');
  92.       TestPlugIn.Caption := GetCaption;
  93.       TestPlugIn.Call := GetProcAddress(TestPlugIn.Address, 'ShowDLLForm');
  94.       PlugIns.Add(TestPlugIn);
  95.       //创建菜单,并将菜单标题,Onclick事件赋值
  96.       NewMenu := TMenuItem.Create(Self);
  97.       NewMenu.Caption := TestPlugIn.Caption;
  98.       NewMenu.OnClick := PlugInsClick;
  99.       NewMenu.Tag := i;
  100.       N_plugins.Add(NewMenu);
  101.     except
  102.       raise EDLLLoadError.Create('初始化失败');
  103.     end;
  104.   end;
  105.   Files.Free;
  106. end;
  107. //插件菜单点击事件
  108. procedure TfrmMain.PlugInsClick(Sender: TObject);
  109. begin
  110.   //根据菜单的tag属性对应函数调用的地址
  111.   @showDllForm := TTestPlugIn(PlugIns[TMenuItem(Sender).Tag]).Call;
  112.   //执行showDllForm函数
  113.   if not showDllForm(application.Handle, TTestPlugIn(PlugIns[TMenuItem(Sender).Tag]).caption) then
  114.     showmessage('打开窗体错误');
  115. end;
  116. //释放插件
  117. procedure TfrmMain.FreePlugIns;
  118. var
  119.   i: Integer;
  120. begin
  121.   //将加载的插件全部释放
  122.   for i := 0 to PlugIns.Count - 1 do
  123.   begin
  124.     FreeLibrary(TTestPlugIn(PlugIns[i]).Address);
  125.   end;
  126.   //释放plugIns对象
  127.   PlugIns.Free;
  128. end;
  129. procedure TfrmMain.FormCreate(Sender: TObject);
  130. begin
  131.   LoadPlugIns;
  132. end;
  133. procedure TfrmMain.FormDestroy(Sender: TObject);
  134. begin
  135.   FreePlugins;
  136. end;
  137. end.