我编写了一个dll函数,返回一个form类型。在onClose中action=caFree.我通过回调函数,在form的onDestroy事件中调用FreeLibrary,释放掉loadLibrary的handle.存在一个问题,就是这个form关闭的时候,调用他的主窗体也关闭掉了。脱离delphi独立运行没什么提示信息。在delphi中运行,在关闭时会出现access violation错误,希望高手指点,谢谢!希望周末能够把这个问题解决。

解决方案 »

  1.   

    应该是
    onDestroy事件中调用FreeLibrary出的错,FreeLibriary时会触发onDestroy事件,而你的onDestroy又调用FreeLibrary,这样好像进入一个怪圈。所以会出现地址非法访问!!
    不能在onDestroy事件中调用FreeLibrary,应在合适的地方调用FreeLibrary,如主窗口关闭时
      

  2.   

    谢谢你。我试验了一下,freeLibrary放在FormClose里,不过还是不行。应该不是你说的问题吧。
    onDestroy只是在form退出内存时触发的事件。FreeLibrary是释放掉LoadLibrary产生的那个整数。FreeLibrary会触发Form的OnDestroy事件吗?
      

  3.   

    脱离Delphi的时候运行没有问题是因为那个异常导致程序关闭,所以你不会看到。
      

  4.   

    楼主的做法容易导致exe和dll之间的资源使用关系发生紊乱,尤其是销毁对象的时候。
    我的变通的方法是在dll中导出过程。
    过程方式如下:
    var
      myFrm :TfrmAbout;
    begin
      try
        myFrm := TfrmAbout.Create( nil );
        myFrm.ShowModal;
        except
          ...
        end;
      finally
        myFrm.Free;
      end;
    end;
      

  5.   

    不应该在dll中调用FreeLibrary吧,谁load的谁free
      

  6.   

    我调用的dll中的窗体是一个mdi子窗体,要求是非模态窗口,所以在调用他的主窗体中比较难判断何时FreeLibrary,我现在是通过回调函数把他释放掉,可能是这里出了问题。
    我后来去掉回调函数,现在子窗体退出的时候,主窗体就不会跟着退出了,但是这样问题也没有解决。一个是dll的handle不释放不好吧,现在在delphi中运行还是会提示错误。