我编写了一个动态库文件,里面含有窗体,函数是:GetName(handle:THandle);
在主程序中,我直接调用该动态库里的函数GetName(application.handle),函数能够正常执行,函数中的窗体也能显示,但是关闭窗体时,主程序会提示非法操作。
同样是一个动态库函数,我在两个不同的主程序中运行,一个没有出错,另一个会有错误提示。不知道哪位老手碰到这样的问题。
在主程序中,我直接调用该动态库里的函数GetName(application.handle),函数能够正常执行,函数中的窗体也能显示,但是关闭窗体时,主程序会提示非法操作。
同样是一个动态库函数,我在两个不同的主程序中运行,一个没有出错,另一个会有错误提示。不知道哪位老手碰到这样的问题。
procedure GetName(aHandle:THandle);
begin
//把应用程序的句柄赋给动态函数
Application.Handle:=aHandle;
//创建窗体
testFrm:=TtestFrm.Create(Application);
try
testFrm.Showmodal; finally
testFrm.free;
end;
end;
主程序:
var
getName:procedure(iHndle:THandle);stdcall;
handle,i:integer;
begin
Handle := LoadLibrary('test.DLL');
@getName:=GetProcAddress(Handle, 'GetName');
if @getName<>nil then
getName(Application.Handle);
end;
关闭这个testfrm窗体时就提示错误。
procedure ttestform.close(sender: TObject);
begin
action := cafree;
testform := nil;
end;
try
testFrm.Showmodal; finally
testFrm.free;
Application.Handle := 0; //Restore it到
end;
testFrm.onClose:=ttestform.close
也没有freelibrary,dll退出比主程序晚,所以你调free的时候导致错误
var
tmpfrm:TtestFrm;//使用这样局部变量减少出错机会。
begin Application.Handle:=aHandle;
//创建窗体
tmpfrm:=TtestFrm.Create(Application);
try
tmpFrm.Showmodal; finally
// tmpFrm.free;
tmpFrm.release;//释放FORM,用RELEASE比FREE好。
end;....
Handle := LoadLibrary('test.DLL');
try
@getName:=GetProcAddress(Handle, 'GetName');
if @getName<>nil then
getName(Application.Handle);
finally
freelibrary(handle);
end;
end;
procedure GetName(aHandle:THandle);加上Stdcall;就不会错了,不小心漏了这个.不过大家提的意见也很正确.我以后要注意的.