delphi 插件类

delphi 插件类

主程序调用

unit myplugin;

interface

uses
Windows, SysUtils, Menus, Forms;

type
TPluginName = function: pchar; stdcall;
TPluginShowForm = procedure; stdcall;
TPlugin_In = function(dllhandle: HWND; In_str: pchar): Boolean; stdcall;

TMyPlugin = record
DllHandle: HWND;
PluginName: TPluginName;
PluginShowForm: TPluginShowForm;
Plugin_In: TPlugin_In;
end;

tplugin = class
pluginarray: array of TMyPlugin;
menuitem: TMenuItem;
in_str: pchar;
handle: integer;
private
procedure searchplugin;
procedure CreateMainmenu;
procedure LoadPlugin(sr: TSearchRec);
procedure menuclick(sender: TObject);
procedure showform(plugin_ID: Integer);
procedure FreePlugin;
public
constructor create(fmenuitem: TMenuItem; Fhandle: Integer; Fin_str: pchar);
destructor destroy; override;
end;

implementation

const
Plugins_Dir        = 'plugin\';

procedure tplugin.LoadPlugin(sr: TSearchRec);
var
plugin             : TMyPlugin;
count              : integer;
dllname            : string;
begin
dllname := ExtractFilePath(ParamStr(0));
dllname := dllname + Plugins_Dir + sr.name;
plugin.DllHandle := LoadLibrary(Pchar(dllname));
if plugin.DllHandle <> 0 then
begin
   @plugin.PluginName := GetProcAddress(plugin.DllHandle, 'pluginname');
   @plugin.PluginShowForm := GetProcAddress(plugin.DllHandle,
    'pluginshowform');
   @plugin.Plugin_In := GetProcAddress(plugin.DllHandle, 'plugin_in');
   if (@plugin.PluginShowForm <> nil) and (@plugin.Plugin_In <> nil) then
    if (@plugin.PluginShowForm <> nil) then
     begin
      count := High(pluginarray) + 1;
      SetLength(PluginArray, count + 1);
      PluginArray[count] := plugin;
     end;
end;
end;

procedure tplugin.CreateMainmenu;
var
menu               : TMenuItem;
count              : integer;
begin
for count := Low(pluginarray) to High(pluginarray) do
begin
   menu := TMenuItem.Create(nil);
   menu.Caption := pluginarray[count].PluginName;
   menu.OnClick := menuclick;
   menuitem.Add(menu);
end;
end;

procedure tplugin.Searchplugin;
const
Plugins_Dir        = 'plugin\';
var
sr                 : TSearchRec;
path               : string;
Found              : Integer;
begin
SetLength(PluginArray, 0);
path := ExtractFilePath(ParamStr(0));
path := path + Plugins_Dir + '\*.dll';
try
Found := FindFirst(path, faArchive, sr);
while Found = 0 do
   begin
    LoadPlugin(sr);
    Found := FindNext(sr);
   end;
CreateMainmenu;
finally
FindClose(sr);
end;
end;

procedure Tplugin.menuclick(sender: TObject);
var
plugin_id          : integer;
begin
plugin_id := menuitem.IndexOf(TmenuItem(Sender));
showform(plugin_id);
end;

procedure Tplugin.FreePlugin;
var
icount             : integer;
begin
for icount := Low(pluginarray) to High(pluginarray) do
FreeLibrary(pluginarray[icount].DllHandle);
end;

procedure tplugin.showform(plugin_ID: Integer);
var
plugin             : TMyPlugin;
begin
plugin := pluginarray[plugin_ID];
plugin.Plugin_In(handle,in_str );
plugin.PluginShowForm;
end;

constructor tplugin.create(fmenuitem: TMenuItem; fhandle: Integer; Fin_str:
pchar);
begin
menuitem := fmenuitem;
handle := Fhandle;
in_str := fin_str;
searchplugin;
end;

destructor tplugin.destroy;
begin
FreePlugin;
end;

end.

-----------------------------------------------

var
plugin             : tplugin;
begin
plugin := tplugin.create(MainMenu1.Items[1], application.handle, 'fff');
end;

{

传入,MainItem,

handle,

IN_STR

}

------------------------------------------------

插件COMMAN.PAS

unit comman_pas;

interface

uses
Classes, ADODB, Forms;

var
tmpstr_sql         : PChar;

function pluginname: PChar; stdcall;
procedure pluginshowform; stdcall;
procedure plugin_in(APPhandle: Integer; in_str: pchar); stdcall;

implementation

uses MYdatamodule, Unit1;

function pluginname: PChar; stdcall;
begin
Result := plugin;
end;

procedure pluginshowform; stdcall;
begin
DM := TDM.Create(Application);
DM.adoconnection1.ConnectionString := tmpstr_sql;
dm.ADOConnection1.Connected := true;
form1 := nil;
form1 := TForm1.Create(Application);
form1.ShowModal;
form1.Free;
end;

procedure plugin_in(APPhandle: Integer; in_str: pchar); stdcall;
begin
Application.Handle := APPhandle;
tmpstr_sql := in_str;
end;

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值