请分析??(功能是将目录下的DLL全部调用到程序中,但是可以运行,调用后出错,好象是内存包错!
private
{ Private declarations }
procedure LoadPlugIns;
procedure FreePlugIns;
procedure PlugInClick(Sender: TObject); public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}var
plugins: TList;
type
//plug in object
TSendMessagesPlugIn = class
Name: String;
Address: Integer;
Call: Pointer;
end;
GetNameFunction = function : PChar;
SendMessageFunction = function (AutoSend:Boolean):Boolean;var
StopSearch: Boolean;procedure SearchFileExt(const Dir, Ext: String; Files: TStrings);
var
Found: TSearchRec;
i : Integer;
Dirs: TStrings; //Store sub-directories
Finished : Integer; //Result of Finding
begin
stopSearch := False;
Dirs := TStringList.Create;
Finished := FindFirst(Dir + '*.*', 63, Found);
while (Finished = 0) and not (StopSearch) do
begin
if (Found.Name[1] <> '.') then
begin
if (Found.Attr and faDirectory = faDirectory) then
Dirs.Add(Dir + Found.Name) //Add to the directories list.
else
if Pos(UpperCase(Ext), UpperCase(Found.Name))>0 then
Files.Add(Dir + Found.Name);
end;
Finished := FindNext(Found);
end;
FindClose(Found);
if not StopSearch then
for i := 0 to Dirs.Count - 1 do
SearchFileExt(Dirs[i], Ext, Files);
Dirs.Free;
end;
procedure TForm1.XP_Button4Click(Sender: TObject);
var
dd:tpoint;
begin
getcursorpos(dd);
pm.Popup(dd.x,dd.y);
end;procedure TForm1.LoadPlugIns;
var
Files: TStrings;
i: Integer;
TestPlugIn : TSendmessagesPlugIn;
NewMenu: TMenuItem;
begin
Files := TStringList.Create;
Plugins := TList.Create;
SearchFileExt(ExtractFilepath(Application.Exename), '.dll', Files);
for i := 0 to Files.Count-1 do
begin
//create a new plug in
TestPlugIn := TsendmessagesPlugIn.Create;
TestPlugIn.Address := LoadLibrary(PChar(Files[i]));
//get the a menu item
TestPlugIn.Name := GetNameFunction(GetProcAddress(TestPlugIn.Address, 'GetName'));
//get the function insert text
TestPlugIn.Call := GetProcAddress(TestPlugIn.Address, 'SendMessages');
PlugIns.Add(TestPlugIn);
//add the plug menu item
NewMenu := TMenuItem.Create(Self);
NewMenu.Caption := TestPlugIn.Name;
NewMenu.OnClick := PlugInClick;
NewMenu.Tag := i;
pm1.Add(NewMenu);
end;
Files.Free;
end;procedure TForm1.FreePlugIns;
var
i: Integer;
begin
for i := 0 to PlugIns.Count-1 do
begin
//free every loaded plugins
FreeLibrary(TSendmessagesPlugIn(PlugIns[i]).Address);
end;
PlugIns.Free;
end;procedure TForm1.PlugInClick(Sender: TObject);
var
pp:boolean;
begin
pp:=SendMessageFunction(TSendmessagesPlugIn(PlugIns[TMenuItem(Sender).Tag]).Call)(false);
if pp then
showmessage('Successfully')
else
showmessage('Error!');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
LoadPlugIns;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
freePlugIns;
end;end.
private
{ Private declarations }
procedure LoadPlugIns;
procedure FreePlugIns;
procedure PlugInClick(Sender: TObject); public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}var
plugins: TList;
type
//plug in object
TSendMessagesPlugIn = class
Name: String;
Address: Integer;
Call: Pointer;
end;
GetNameFunction = function : PChar;
SendMessageFunction = function (AutoSend:Boolean):Boolean;var
StopSearch: Boolean;procedure SearchFileExt(const Dir, Ext: String; Files: TStrings);
var
Found: TSearchRec;
i : Integer;
Dirs: TStrings; //Store sub-directories
Finished : Integer; //Result of Finding
begin
stopSearch := False;
Dirs := TStringList.Create;
Finished := FindFirst(Dir + '*.*', 63, Found);
while (Finished = 0) and not (StopSearch) do
begin
if (Found.Name[1] <> '.') then
begin
if (Found.Attr and faDirectory = faDirectory) then
Dirs.Add(Dir + Found.Name) //Add to the directories list.
else
if Pos(UpperCase(Ext), UpperCase(Found.Name))>0 then
Files.Add(Dir + Found.Name);
end;
Finished := FindNext(Found);
end;
FindClose(Found);
if not StopSearch then
for i := 0 to Dirs.Count - 1 do
SearchFileExt(Dirs[i], Ext, Files);
Dirs.Free;
end;
procedure TForm1.XP_Button4Click(Sender: TObject);
var
dd:tpoint;
begin
getcursorpos(dd);
pm.Popup(dd.x,dd.y);
end;procedure TForm1.LoadPlugIns;
var
Files: TStrings;
i: Integer;
TestPlugIn : TSendmessagesPlugIn;
NewMenu: TMenuItem;
begin
Files := TStringList.Create;
Plugins := TList.Create;
SearchFileExt(ExtractFilepath(Application.Exename), '.dll', Files);
for i := 0 to Files.Count-1 do
begin
//create a new plug in
TestPlugIn := TsendmessagesPlugIn.Create;
TestPlugIn.Address := LoadLibrary(PChar(Files[i]));
//get the a menu item
TestPlugIn.Name := GetNameFunction(GetProcAddress(TestPlugIn.Address, 'GetName'));
//get the function insert text
TestPlugIn.Call := GetProcAddress(TestPlugIn.Address, 'SendMessages');
PlugIns.Add(TestPlugIn);
//add the plug menu item
NewMenu := TMenuItem.Create(Self);
NewMenu.Caption := TestPlugIn.Name;
NewMenu.OnClick := PlugInClick;
NewMenu.Tag := i;
pm1.Add(NewMenu);
end;
Files.Free;
end;procedure TForm1.FreePlugIns;
var
i: Integer;
begin
for i := 0 to PlugIns.Count-1 do
begin
//free every loaded plugins
FreeLibrary(TSendmessagesPlugIn(PlugIns[i]).Address);
end;
PlugIns.Free;
end;procedure TForm1.PlugInClick(Sender: TObject);
var
pp:boolean;
begin
pp:=SendMessageFunction(TSendmessagesPlugIn(PlugIns[TMenuItem(Sender).Tag]).Call)(false);
if pp then
showmessage('Successfully')
else
showmessage('Error!');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
LoadPlugIns;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
freePlugIns;
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货