procedure TForm1.Button1Click(Sender: TObject);
Type
fmTForm=function(fmMainForm:TForm1):TForm;stdcall;
var
hDll:THandle;
fmTForm2:fmTForm;
begin
hDLl:=LoadLibrary('Project2.dll');
fmTForm2:=GetProcAddress(hDll,'fmTForm2');
mdiform:=fmTForm2(Self);
mdiform.Show;
FreeLibrary(hDll); // 只要执行这段句代码,释放DLL,系统就报错,如果采用静态调DLL则一切正常
end;错误信息如下:
Access violation at address 02326398.Read of address 02326398应该在程序的什么地方执行FreeLibrary释放句柄才对?
Type
fmTForm=function(fmMainForm:TForm1):TForm;stdcall;
var
hDll:THandle;
fmTForm2:fmTForm;
begin
hDLl:=LoadLibrary('Project2.dll');
fmTForm2:=GetProcAddress(hDll,'fmTForm2');
mdiform:=fmTForm2(Self);
mdiform.Show;
FreeLibrary(hDll); // 只要执行这段句代码,释放DLL,系统就报错,如果采用静态调DLL则一切正常
end;错误信息如下:
Access violation at address 02326398.Read of address 02326398应该在程序的什么地方执行FreeLibrary释放句柄才对?
请问多少专家分有1颗星!?谢谢!
hDLl:=LoadLibrary('Project2.dll');
@fmTForm2:=GetProcAddress(hDll,'fmTForm2');//加个@,表示地址
mdiform:=fmTForm2(Self);
mdiform.Show;
FreeLibrary(hDll);
2、mdiform.Show的模式窗口退出后,系统也许正在对mdiform析构,这是执行FreeLibrary将DLL释放,正在执行mdiform析构的方法会报错(推测);
3、建议:执行mdiform.Show后Sleep(1000),但是我不能肯定是这个原因。
你试着在freelibrary前close mdiform
修改的办法:在mdiform存在期间不能够freelibrary,freelibrary只能在mdiform关闭后执行,所以不能放在这段程序中。