怎样判断一个DLL窗体已关闭?
我用fsMDIForm窗体方式.每个DLL窗体中的数据都动态连接了数据库,所以要每个窗体只能打开一次.关闭该窗体后,再能创建.
请各位高手多多指教!

解决方案 »

  1.   

    >>怎样判断一个DLL窗体已关闭?
    Api: FindWindowor如果你dll的窗體, 也是共享 主程序的application
    那麼, 可以,  application.Components 來查找
      

  2.   

    我是共享主程序的Application的。
    具体怎么个写法请祥说,谢谢!
      

  3.   

    我的DLL代码如下:
    uses
      SysUtils,
      Forms,
      Windows,
      Messages,
      ADODB,
      Classes,
      Ucarinfo in 'Ucarinfo.pas' {Frcarinfo};{$R *.res}
    var
      DLLApp: TApplication;
      DLLScr: TScreen;
      
    function CreateCarInfoDLL(con:TADOConnection; App: TApplication; Scr: TScreen):TForm;
    begin
      Application := App;
      Screen := Scr;
      condll:=con;
      if not assigned(Frcarinfo) then
        Application.CreateForm(TFrcarinfo, Frcarinfo);  //创建一个Frcarinfo的窗体
      result:=frcarinfo;
    end;procedure ExitDLL(Reason: Integer);
    begin
      if Reason = DLL_PROCESS_DETACH then
      begin
        Application := DLLApp;
        Screen := DLLScr;
        Frcarinfo:=Nil;
      end;
    end;exports
      CreateCarInfoDLL;begin
      DLLApp := Application;
      DLLScr := Screen;
      DLLProc := @ExitDLL;
    end.我在主程序中动态调用时,打开窗体关闭后,第二次就无发再打开了,请问我的代码哪里出错了?
      

  4.   

    楼上的兄弟,我试过了不行,程序关闭时还报错了!
    我问过别人,代码一样的我这里却出错了。
    主程序中动态调用代码:
    InvokeDLLForm = function(con:TADOConnection; App: TApplication; Scr: TScreen): TForm;var
      FrMain: TFrMain;
      CarInfoForm: TForm;procedure TFrMain.N13Click(Sender: TObject);
    var
      DLLHandle: THandle;
      DLLSub: InvokeDLLForm;
    begin
      DLLHandle := LoadLibrary('carinfodll.dll');
      if DLLHandle <> 0 then
      begin
        @DLLSub := GetProcAddress(DLLHandle, 'CreateCarInfoDLL');
          if Assigned(DLLSub) then
          begin
            CarInfoForm := DLLSub(Frmain.con, Application, Screen);
          end;
      end;
    end;
      

  5.   

    两种方法,一种是定义一个窗体变量,mFrom,在关闭窗口时,进行一次mForm = nil;
    这可以在OnCloseWindow里面进行.
    另一种是建立一个互斥对象,就不怕会出现第二个窗体了。方法如下:
    procedure OnCreateWindow;
    var 
      mutex     : THandle;
      mutexName : array [0..7] of char;
    begin
      StrPCopy(mutexName ,'aaaa3.0');
      mutex := openmutex(MUTEX_ALL_ACCESS, False, mutexName);
      If mutex = 0 then begin
        mutex := createmutex ( nil , true, mutexName);
        application.createwindow(FrmMain,TFrmMain);
        application.run;
        ReleaseMutex (mutex);
      end;
    end;
      

  6.   

    谢谢楼上的朋友,我已经解决了问题。原来我在DLL中忘在Uses中加ShareMem了!