动态库释放问题. ( 积分: 200 )

  • 主题发起人 主题发起人 free_dragon
  • 开始时间 开始时间
F

free_dragon

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个DLL,在这个DLL中调用另外一个DLL,其实就是把一个DLL重新封装一下,我定义了一个全局变量handel : THandle;,然后在OpenComm中装载DLL, handle := LoadLibrary('1.dll'),在CloseComm中释放DLL,FreeLibrary(handle);编译通过了,但是在调用的时候就会出现地址错误,请问这个问题如何解决.
 
问题和你描述的信息没有关系,应该是其他原因
 
我把释放那条语句删除后就不会弹出错误了
 
试试类似这样行不:
Moudle:THandle;
begin
try
Moudle:=LoadLibrary('ReadCardInfo.dll');
if Moudle>32 then begin
PStart:=GetProcAddress(Moudle, 'LoadMonitor');

mG_DateTime:=StrPCopy(mG_DateTime,datetimetostr(G_DateTime));
mFileNameExt:=StrPCopy(mFileNameExt,PPP.FileNameExt);
mPath:=StrPCopy(mPath,Application.ExeName);
mGFileSize:=StrPCopy(mGFileSize,inttostr(G_FileSize));
mReturnFileName:=StrPCopy(mReturnFileName,G_FileName);
iInt:=PStart(mPath,mFileNameExt,mG_DateTime,mGFileSize,mReturnFileName);
end;
finally
FreeLibrary(Moudle); //调用完毕收回DLL占用的资源
end;
 
代码应该贴上来吧
 
有代码,替你调试一下
 
DLL:
//打开连接
function OpenComm():Pchar;stdcall;
var
FOpenComm : TOpenComm;
pinfo : PChar;
begin
if handle =0 then
handle := LoadLibrary('IdentityFace.dll');

@FOpenComm := GetProcAddress(handle,'OpenComm');
if Assigned(FOpenComm) then
pinfo := FOpenComm();

Result := pinfo;
end;

//关闭连接
function CloseComm():Pchar;stdcall;
var
FCloseComm : TCloseComm;
pinfo : PChar;
begin
@FCloseComm := GetProcAddress(handle,'CloseComm');
if Assigned(FCloseComm) then
pinfo := FCloseComm();
Result := pinfo;

FreeLibrary(handle);

end;

调用:
procedure TForm1.Button6Click(Sender: TObject);
var
cc: CloseComm;
begin
@cc := GetProcAddress(Th,'CloseComm');
if @cc <> nil then
begin
Memo1.Lines.Add('取得CloseComm方法成功');
//try
if cc() = 'OK' then
begin
Memo1.Lines.Add('关闭连接成功');
end
else
Memo1.Lines.Add('关闭连接出错:' + cc());
//except
//end;
end
else
Memo1.Lines.Add('取得CloseComm方法出错');
end;
 
to snowmao:
可能调试不了,这是个读卡器的DLL,你没有读卡器调试不了
 
你是调用了已经释放过的资源,释放语句可能是在你调用之前执行的,所以会报错的,仔细检查一下,单步调试一定能查出原因的
 
function OpenComm():Pchar;stdcall;
var
FOpenComm : TOpenComm;
pinfo : PChar;
begin
if handle =0 then
handle := LoadLibrary('IdentityFace.dll');

@FOpenComm := GetProcAddress(handle,'OpenComm');
if Assigned(FOpenComm) then
pinfo := FOpenComm(); //能否给出TOpenComm 的原码! 那有这样返回指针的呀
//这样的定义确实也可以实现! 但不是一种好的设计呀!

Result := pinfo;
end;
//看到这个我就晕了! 哈哈. 不地址出错的才怪~!
 
下面这个贴,应该对你有帮助!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3530241
 
同意 kk2000
pinfo := FOpenComm();
这里肯定错了,不该写FOpenComm的,应该写你程序里的函数
 
function OpenComm():Pchar;stdcall;
var
FOpenComm : TOpenComm;
pinfo : PChar;
begin
if handle =0 then
handle := LoadLibrary('IdentityFace.dll');

@FOpenComm := GetProcAddress(handle,'OpenComm');
if Assigned(FOpenComm) then
pinfo := FOpenComm(); //能否给出TOpenComm 的原码! 那有这样返回指针的呀
//这样的定义确实也可以实现! 但不是一种好的设计呀!

Result := pinfo;
end;

这确实是出错的主要原因,如果从函数中返回值字符串,要么在调用函数中分配好空间,在被调用函数参数写成var 方式的函数返回,要么要加shareMem单元。
建议使用前一种方式操作。
 
我寫了一個DLL。結果出錯。。
 
多人接受答案了。
 
后退
顶部