已经成功调用了mdi窗体,因为是show,所以不知什么时候freelibrary
已经搜索过以前的帖子,大家都没有在主程序中freelibrary,现在必须要freelibrary,请问如何解决!!

解决方案 »

  1.   

    可以参考我以下的程序片段:
    var
      DLLHandle: THandle;
      DLLSub: InvokeDLLForm;
    begin
      Result:=true;
      try    DLLHandle := LoadLibrary(Pchar(xFileName));
        if DLLHandle <> 0 then
        begin
          @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
          if Assigned(DLLSub) then
          begin
            //DLLForm := DLLSub(Application, Screen);
            DLLSub(Application, Screen,vararrayof(['A','']))
          end
          else
            RaiseLastWin32Error;
        end;
      finally
        FreeLibrary(DLLHandle); //调用完毕收回DLL占用的资源  end;
      

  2.   

    晕死, 机制不同, mdi 和 dll 不能混用, 两边都 link 了 MemMgr, 主窗体一关总会有异常, 原因是多 free 了一次把 dll 作成 bpl, 就是建立包
    http://community.borland.com/article/0,1410,27178,00.html
    这页里有说明, 不知我这为什么,下不全, 一半就停了, google 中找 dynamic bpl
      

  3.   

    to zhuhq(alpha):
    调完dll立即释放肯定有问题,因为mdi是show.to  comanche(太可怕);
    mdi+dll没有任何问题啊,甚至我已经实现只要是不同的dll加载,然后发送消息通知主程序释放dll,现在就是不能解决为什么同一个dll,就不能loadlibrary两次!
      

  4.   

    http://www.delphibox.com/article.asp?articleid=563你可以看有一下这个例子...有代码。
      

  5.   

    to ksaiy(消失在人海) 
    这些代码我都看过了,大多数都没有freelibrary,但有一个代码和我的很相似,是采用消息传递的,但仍然不能解决同一个dll,加载两次以上的问题。难道大家写程序都不考虑释放吗??
      

  6.   

    to  楼主:
      你不必发愁,你的问题碰巧我知道,我公司的MIS框架是本人建立的,MDI+DLL,
      

  7.   

    to loveWife(我爱红) 
    你是怎么解决这个问题的,我们可以讨论一下啊,
    我的msn: [email protected]
      

  8.   

    //mdi+dll没有任何问题啊,甚至我已经实现只要是不同的dll加载,然后发送消息通知主程序释
    //放dll,现在就是不能解决为什么同一个dll,就不能loadlibrary两次!当然可以了。
      

  9.   

    to loveWife(我爱红)
    你还没有弄清楚我的意思,我有两个不同的业务界面使用的是同一个dll,同时打开这两个业务界面(实际上一个dll加载了两次),然后分别释放就会有问题,你可以试一下!
    如果是先打开一个,然后关闭,然后再打开同一个,再释放,我也是成功的!
      

  10.   

    to 楼主:
      你不应该在每个窗体关闭的时候,都释放窗体所属的DLL,象你现在的问题,一个DLL的两个窗体先后打开,关闭其中一个,就要释放DLL,而另一个窗体还在显示,当然不行了。
      show 和showmodal 不同,你可以在.exe 里建一个变量FormNum ,打开窗体时 FormNum +1 ,接收到关闭窗体的消息是FormNum -1 ,如果FormNum = 0 则表示关闭的是DLL的最后一个窗体,这时后在freelibrary。
      

  11.   

    to  loveWife(我爱红) 
    我试过了,两次load,就必须两次free,所以只free最后一次是不行的。
    另外,你能否发代码到我的信箱。mail:  [email protected]
    解决了分可以再加。
      

  12.   

    to  loveWife(我爱红) 
    我试过了,两次load,就必须两次free,所以只free最后一次是不行的。你为什么需要两次load?? 你可以先判断是否已经load成功了。。 loveWife(我爱红) 的引用计数是一种不错的方法。。很多地方用到。。
      

  13.   

    不需要两次load    .....
        if DLLHandle = 0 then
          DLLHandle := LoadLibrary(Pchar(xFileName));
        else
        begin
          @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
          if Assigned(DLLSub) then
          begin
            //DLLForm := DLLSub(Application, Screen);
            DLLSub(Application, Screen,vararrayof(['A','']))
          end;
        end;
        .......