怎样释放DLL? (30分)

  • 主题发起人 主题发起人 pengyi007
  • 开始时间 开始时间
P

pengyi007

Unregistered / Unconfirmed
GUEST, unregistred user!
我用静态方法调用了DLL:
function tm2kp_Init():bool
external 'tm2kplus.dll';
function tm2kp_Uninit():bool
external 'tm2kplus.dll';
在这儿进行初始化:
procedure TF_Yhshch_Shxj.FormShow(Sender: TObject);
begin
//tm2kp_init();
if not tm2kp_init()
then
begin
// MessageBox(Application.handle,'²É¼¯¿¨³õʼ»¯Ê§°Ü!','Ìáʾ',MB_ok+ MB_DEFBUTTON1+MB_ICONExclamation);
showmessage('初始化失败');
N12.Enabled:=false;
k1.Enabled:=false;
bsSkinButton1.Enabled:=false;
bsSkinButton3.Enabled:=false;
tm2kp_uninit;
///tm2kp_init;
end;

end;
在这儿进行释放:
procedure TF_Yhshch_Shxj.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
tm2kp_uninit;
My10Moons2KPlus1.Free;
end;

出现的情况有:
1.第一次初始化以后的二次运行次窗体时候就报‘初始化失败’,怀疑没有真正释放DLL
2.在DELPHI里面调试的时候就出现这种情况,关闭DELPHI,脱离情况下执行就没有这种情况。

怎么回事?我怀疑关闭窗体时候没有真正释放DLL,怎样释放DLL,最好有实例。
 
tm2kp_init()
//1
if not tm2kp_init() //2
then
begin
……
1、2两处地方都运行了tm2kp_init()
 
哦,跟这个没有关系的
这一部分是我后面调试时候加上去的:
if not tm2kp_init()
then
begin
// MessageBox(Application.handle,'²É¼¯¿¨³õʼ»¯Ê§°Ü!','Ìáʾ',MB_ok+ MB_DEFBUTTON1+MB_ICONExclamation);
showmessage('初始化失败');
N12.Enabled:=false;
k1.Enabled:=false;
bsSkinButton1.Enabled:=false;
bsSkinButton3.Enabled:=false;
tm2kp_uninit;
///tm2kp_init;
end;

原来是这样,也不可以
procedure TF_Yhshch_Shxj.FormShow(Sender: TObject);
begin
tm2kp_init()
end;
 
假如我动态加载:
DLLHandle := 0;
if DLLHandle = 0 then
begin
DLLHandle := LoadLibrary('tm2kplus.dll');
try
if DLLHandle = 0 then
raise Exception.Create('装入动态连接库DLLFile.dll失败!');
{ @DLLFunc := GetProcAddress(DLLHandle, 'DLLFunc');
showmessage(inttostr(DLLFunc(0)));
if @DLLFunc = nil then
Abort;
DLLProc:=GetProcAddress(DLLHandle, 'DLLProc');
if @DLLProc = nil then
Abort
}
except
FreeLibrary(DLLHandle);
DLLHandle := 0;
end;
end;
如上面的代码,我在什么时候进行初始化的呢?
 
在DllMain中,每一次DLL被加载和卸载的时候都要调用的。
 
关闭窗体的时候使用FreeLibrary释放dll
 
既然是动态调用,那用完了就要立刻释放
procedure Tform1.Formshow();
begin
DLLHandle := LoadLibrary('tm2kplus.dll');//调入库
try
funProc:=GetProcAddress(DLLHandle, 'tm2kp_Init');//调入过程
if (@DLLFunc = nil) and (not funproc )then
begin
showmessage('初始化失败');
N12.Enabled:=false;
k1.Enabled:=false;
bsSkinButton1.Enabled:=false;
bsSkinButton3.Enabled:=false;
end;
finally
FreeLibrary(dllhandle)//用与释放dll;
end;
end;
 
谢谢,问题已经解决了,分钱!
 
后退
顶部