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释放句柄才对?

解决方案 »

  1.   

    楼上的说法不正确,Dll是被映射对应进程虚内存空间的,所以动态调用方法不存在这样的问题!
      

  2.   

    晕!fmTForm2:=GetProcAddress(hDll,'fmTForm2');这样行吗?我还真的没试过,我都是通过一个导出函数来做的!
      

  3.   

    FrameSniper(人类不能不吃饭@手机不能不充电.net):
    请问多少专家分有1颗星!?谢谢!
      

  4.   


      hDLl:=LoadLibrary('Project2.dll');
      @fmTForm2:=GetProcAddress(hDll,'fmTForm2');//加个@,表示地址
      mdiform:=fmTForm2(Self);
      mdiform.Show;
      FreeLibrary(hDll);
      

  5.   

    fmTForm2:=GetProcAddress(hDll,'fmTForm2');//这样完全可以@fmTForm2:=GetProcAddress(hDll,'fmTForm2');//加个@,表示地址,这样的我试过了,报同样的错。    只要执行FreeLibrary就报错,如果不执行FreeLibrary就正常。应该怎么样释放DLL句柄才对呀?
      

  6.   

    1、fmTForm2前边要家“@”:  @fmTForm2;
    2、mdiform.Show的模式窗口退出后,系统也许正在对mdiform析构,这是执行FreeLibrary将DLL释放,正在执行mdiform析构的方法会报错(推测);
    3、建议:执行mdiform.Show后Sleep(1000),但是我不能肯定是这个原因。
      

  7.   

    执行mdiform.show后sleep(1000),freelibrary时系统报同样的错。
      

  8.   

    用mdiform.ShowModal
    你试着在freelibrary前close mdiform
      

  9.   

    是我看错了,Show是非模式窗口显示(模式窗口为ShowModal),即显示出窗口实例后立即返回了,而窗口实例一直存在,直到窗口关闭为止。紧接着就会执行freelibrary,但是,此时窗口实例还在运行,所以必然出错。
    修改的办法:在mdiform存在期间不能够freelibrary,freelibrary只能在mdiform关闭后执行,所以不能放在这段程序中。