我做了一个dll名字为testdll1,里面包含一个子窗口,主程序为testmain里面包含主窗口,在调用时报如下两个错误:Project testMain.exe raised exception class EInvalidOperation with message 'Cannot make a visible window modal'.Process stopped.Use Step or Run to continue.Exception EInvalidOperation in module testdll1.dll at 0005BF31.我跟了一下dll程序,
  ptr:=@(application.MainForm);
  ptr^:=longint(mainform);
  form1:=tfrm_carinfo.Create(mainform);
  form1.ShowModal;//错误出现在这句。但是除了这两句错误以外其它的运行结果都正确,不明白是哪里做错了,请指教

解决方案 »

  1.   

    调用showModal的窗口,先设置Visible := false
      

  2.   

    好想不行加上这句后出现Cannot hide an MDI Child Form的错误!
      

  3.   

    啊,是你的MainForm被设置成了mdichild而不是mdiform了吧。
      

  4.   

    form1:=tfrm_carinfo.Create(self);
      form1.ShowModal;//错误出现在这句。
      

  5.   

    我将调用和被调程序贴出来dll中的被调程序
    procedure jh(mainform:Tform);stdcall;
    var
      ptr:PLongInt;
      form1:tfrm_carinfo;
    begin
      ptr:=@(application.MainForm);
      ptr^:=longint(mainform);
      form1:=tfrm_carinfo.Create(mainform);
      form1.ShowModal;  //错误出现在这句
    end;主程序中的调用程序
    procedure Tfrm_mainOPT.menu_CarInfoClick(Sender: TObject);
    type
      mypointer=procedure(form:TForm);stdcall;
    var
      showform:mypointer;
      Moudel: THandle;
    begin
      moudel:=Loadlibrary('testdll1.dll');
      if Moudel > 32 then
        begin
    showform:= GetProcAddress(moudel, 'jh');
         showform(application.MainForm);
    FreeLibrary(moudel);
        end;
    end;
      

  6.   

    DLL里面
    var
      Form1 :TForm1;procedure ShowWindow(Handle :THandle);
    begin 
      Application.Handle :=Handle;
      Form1 :=TForm1.Create(Application.Handle);
      Form1.ShowModel;
    end;调用代码
    TShowWindow = procedure (Handle :THandle);procedure CallWindow;
    var
      ShowWindow :TShowWindow;
      LibHandle :THandle;
    begin
      LibHandle :=LoadLibrary('xxx.dll');
      if LibHandle <> 0 then
      begin
        @ShowWindow :=GetProcAddress(LibHandle, 'ShowWindow');
        if @ShowWindow <> nil then
          ShowWindow(Application.Handle);
      end;
    end;
    //在主窗体释放的时候再调用FreeLibrary
      

  7.   

    //在主窗体释放的时候再调用FreeLibrary能否说明白一点?