type //装载插件时赋值
TPlugIn = class
Address: THandle;
CallGetPlugInsName: Pointer;
CallOpen: Pointer;
CallSendCode: Pointer;
CallCheckAlarm: Pointer;
end;procedure LoadPlugIn(Dir: string);
var
Files: TStrings;
i: integer;
PlugIn: TPlugIn;
begin
Files := TStringList.Create;
SearchFileEx(Dir, '.dll', Files);
for i := 0 to Files.Count - 1 do
begin
PlugIn := TPlugIn.Create;
PlugIn.Address := LoadLibrary(PChar(Files[i]));
if PlugIn.Address = 0 then //装载插件信息进PlugIn;
raise EDllLoadError.Create('装载' + PChar(Files[i]) + '失败');
try
PlugIn.CallGetPlugInsName := GetProcAddress(PlugIn.Address, 'GetPlugInsName');
PlugIn.CallOpen := GetProcAddress(PlugIn.Address, 'Open'); ;
PlugIn.CallSendCode := GetProcAddress(PlugIn.Address, 'SendCode');
PlugIn.CallCheckAlarm := GetProcAddress(PlugIn.Address, 'CheckAlarm');
PlugInsInfo.Add(PlugIn);
except
raise EDllLoadError.Create('初始化插件失败');
end;
end;
Files.Free;
end;procedure FreePlugIn;
var
i:integer;
begin
for i:=0 to PlugInsInfo.Count-1 do
begin
FreeLibrary(TPlugIn(PlugInsInfo[0]).Address);
end;
PlugInsInfo.Free ;
end;
问题是为什么释放FreeLibrary第一个地址是对的,到第二个就报内存错误???
TPlugIn = class
Address: THandle;
CallGetPlugInsName: Pointer;
CallOpen: Pointer;
CallSendCode: Pointer;
CallCheckAlarm: Pointer;
end;procedure LoadPlugIn(Dir: string);
var
Files: TStrings;
i: integer;
PlugIn: TPlugIn;
begin
Files := TStringList.Create;
SearchFileEx(Dir, '.dll', Files);
for i := 0 to Files.Count - 1 do
begin
PlugIn := TPlugIn.Create;
PlugIn.Address := LoadLibrary(PChar(Files[i]));
if PlugIn.Address = 0 then //装载插件信息进PlugIn;
raise EDllLoadError.Create('装载' + PChar(Files[i]) + '失败');
try
PlugIn.CallGetPlugInsName := GetProcAddress(PlugIn.Address, 'GetPlugInsName');
PlugIn.CallOpen := GetProcAddress(PlugIn.Address, 'Open'); ;
PlugIn.CallSendCode := GetProcAddress(PlugIn.Address, 'SendCode');
PlugIn.CallCheckAlarm := GetProcAddress(PlugIn.Address, 'CheckAlarm');
PlugInsInfo.Add(PlugIn);
except
raise EDllLoadError.Create('初始化插件失败');
end;
end;
Files.Free;
end;procedure FreePlugIn;
var
i:integer;
begin
for i:=0 to PlugInsInfo.Count-1 do
begin
FreeLibrary(TPlugIn(PlugInsInfo[0]).Address);
end;
PlugInsInfo.Free ;
end;
问题是为什么释放FreeLibrary第一个地址是对的,到第二个就报内存错误???
begin
FreeLibrary(TPlugIn(PlugInsInfo[0]).Address);
^ -> 改为 i
end;
PlugInsInfo.Free ;
TPlugIn = class
Address: THandle;
CallGetPlugInsName: Pointer;
CallOpen: Pointer;
CallSendCode: Pointer;
CallCheckAlarm: Pointer;
end;
那些指针都去掉,则正常,即
TPlugIn = class
Address: THandle;
end;
但这样满足不料我的要求阿
PlugInsInfo.Add(PlugIn);
PlugIn.free;