这几天需要在DLL里作一些操作:对每一个目录下的DLL进行一次动态加载,并调用一个函数,来进行判断。
代码如下:
var
i : Integer;
Ask : Boolean;
FileName, DllFile : String;
tmList : TList; { 通过校验的文件列表 }
begin
tmList := TList.Create;
{ 是否有不使用的文件版本信息,有则删除 }
{ 删除非系统文件类型 }
(* *)
with FClientDataSet do
begin
try
if EnLib = 0 then
EnLib := LoadLibrary(Encode_DLL);
if EnLib = 0 then
raise EDLLLoadError.Create(Encode_DLL + LoadFileErr)
else
begin
@procGetFileVerify := GetProcAddress(EnLib, 'F0001');
if Assigned(procGetFileVerify) then
begin
end;
end;
First;
while not Eof do
begin
Ask := False;
for i := 0 to aList.Count - 1 do
begin
{ 删除非系统文件类型 }
if CompareText(PFileNode(aList.List^[i]).FileName, Fields.FieldByName('FileName').Value) = 0 then
begin
DllFile := PFileNode(aList.List^[i]).FilePath + PFileNode(aList.List^[i]).FileName;
FileName := PFileNode(aList.List^[i]).FileName;
try
if dllLib = 0 then
dllLib := LoadLibrary(PChar(DllFile));
if dllLib = 0 then
// raise EDLLLoadError.Create(DllFile + LoadFileErr)
else
begin
@procGetFileVInfo := GetProcAddress(dllLib, 'FM0001');
if Assigned(procGetFileVInfo) then
{ 进行校验 }
if procGetFileVerify(PChar(FileName), procGetFileVInfo) then
begin
tmList.Add(aList.List^[i]);
Ask := True;
Break;
end;
end;
finally
FreeLibrary(dllLib);
dllLib := 0;
end;
end;
end;
if not Ask then
Delete
else
Next;
end;
finally
FreeLibrary(EnLib);
EnLib := 0;
end;
end;
.....
我的数据库操作DLL是通过别的文件来调用的,是以加载的,现在只是加载一次,返回个值,然后释放掉。。
从DLL的理论上来说,我这个DLL只是引用+1,释放-1。
但是,我程序中数据库操作对象一直加载中,关闭,不释放,再开启那么报 "mismatch in datapacket" 错误。
报错代码段
FClientDataSet.Active := True;
好怪,再研究一下。。