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.