主程序动态调用DLL中的非模式窗体后,如何释放该窗体?因为我关闭窗体后查看内存占用情况发现内存占用多了一些,每打开一次再关闭,内存占用都会递增,如何解决这种问题?请高手指导,最好用代码说明,谢谢!

解决方案 »

  1.   

    Form1 := TForm.Create(nil) ;
    try
    Form1.Show() ;
    finally
    Form1.Free ;
    Form1 := nil ;
    end;
      

  2.   

    Form1 := TForm.Create(nil) ; 
    try 
    Form1.Show() ; 
    finally 
    Form1.Free ; 
    Form1 :=nil ; 
    end; 
      

  3.   


    with TForm1.Create(nil) do
    begin
      try
        ShowModal;
      finally
        Free;
      end;
    end;
      

  4.   

    dll里要有关闭那个非模式对话框的导出函数,调用即可
      

  5.   

    TO:cai5 
      你这样窗体刚被创建就释放了,没有任何意义。TO:kampan
      你说的是模态窗体,这样可以,但我问的是非模态窗体。
      

  6.   


    不好意思 我没看清楚!
    你在窗体关闭时
    procedure TfrmIC_Tsam.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      frmIC_Tsam:=nil;
    end;
      

  7.   

    with TForm1.Create(nil) do
    begin
      try
        ShowModal;
      finally
        Free;
      end;
    end;
    procedure TfrmIC_Tsam.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      frmIC_Tsam:=nil;
    end;恩,楼上的,好像就可以了。。
      

  8.   

    我的代码如下,请大家指教应该如何修改???//======下面是主程序调用代码=========
    procedure TfrmMain.mi_inDLLClick(Sender: TObject);
    var
      DLLHandle: THandle;
      DLLSub: InvokeDLLForm;begin
      DLLHandle := LoadLibrary('prjDLL.dll');
      if DLLHandle <> 0 then
      begin
        @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
        if Assigned(DLLSub) then
        begin
          DLLForm := DLLSub(Application, Screen);
        end;
      end;
    end;//=======下面是DLL中代码=============
    var
      DLLApp: TApplication;
      DLLScr: TScreen;
    function CreateDLLForm(App: TApplication; Scr: TScreen):TForm;
    var
      ptr:PLongInt;
    begin
      Application := App;
      Screen := Scr;
      Application.CreateForm(TfrmDLLForm, frmDLLForm);
      result:=frmDLLForm;
    end;procedure ExitDLL(Reason: Integer);
    begin
      if Reason = DLL_PROCESS_DETACH then
      begin
        Application := DLLApp;
        Screen := DLLScr;
      end;
    end;
    exports
      CreateDLLForm;begin
      DLLApp := Application;
      DLLScr := Screen;
      DLLProc := @ExitDLL;end.
      

  9.   

    DLL 调用完成后
    DLLForm.Close;窗体加个
    procedure TfrmDLLForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
      

  10.   

    你意思是不是這樣:
    關閉dll窗體後,還要釋放dll所占用的空間?
    可以這樣:
    1、在一個單元裡聲明 WM_FreeMe = WM_USER + 100,主程序和dll程序分別引用這個單元;
    2、在主程序寫一個該消息處理函數函數
       begin 
         FreeLibrary(DLLHandle[msg.lParam]);
       end;
    3、sendmessage(主窗.handle,WM_FreeMe,nil,Pchar(dll名稱));
    4、定義DLLHandle數組,可以這樣:
       MaxDllNum=50;//具體數量根據實際修改
    const
       dll名稱1=0;
       dll名稱2=1;
    5、調用dll時可以這樣:
      DLLHandle[prjDLL] := LoadLibrary('prjDLL.dll');