我建了一个进程外服务器 
1> new -> application 
2> new -> AutoMation Object 
这时候调用会有个窗体,能正常调用自动对象。
然后把Application中的Form删除编译,就无法正常使用
报:
---------------------------
Debugger Exception Notification
---------------------------
Project Project4.exe raised exception class EOleSysError with message '服务器运行失败'. Process stopped. Use Step or Run to continue.
---------------------------有窗体的App代码
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
无窗体的App代码
begin
  Application.Initialize;
  //Application.CreateForm(TForm1, Form1);
  Application.Run;
end.分析后发现,在有窗体的时候,消息在窗体中循环不会退出,一旦删除这个空窗体后运行未进入消息循环直接退出宿主关闭导致无法调用。
直接隐藏主窗体是可以,但是当调用主窗体就像幽灵一样闪现。如何才能建进程外没有主窗体服务?

解决方案 »

  1.   

      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.ShowMainForm := False;
      Application.Run;加入  Application.ShowMainForm := False;这一句看看
      

  2.   

    如果只是为了不显示主窗体你还可以在formCreate事件里面把窗体设置为w=0,h=0,或者设置成完全透明的窗体也行
      

  3.   

    把你的代码放到while循环里面去。
      

  4.   


    这样调用一次,会刷屏闪烁一次。任务栏会刷一下。调用一次,还是会闪一下,是因为界面失去焦点。任务栏会刷一下。
    procedure TForm7.FormCreate(Sender: TObject);
    begin
      Height := 0;
      Width := 0;
      // 这样任务栏里也不显示^_^
      SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
    end;如果能解决闪烁问题,那就圆满了。
    小弟是个自动对象,不知道如何放在while中处理?
      

  5.   

    不知道你是怎么调用的,用CreateProcess能不能解决你的问题,如下:
    var
      StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;
    begin
      FillChar(StartupInfo,Sizeof(StartupInfo),0);
      StartupInfo.cb := Sizeof(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_SHOWNORMAL; //隐藏的话改为SW_HIDE
      CreateProcess(nil,
                    'test.exe', //要运行的程序
                    nil,
                    nil,
                    false,
                    0,
                    nil,
                    nil,
                    StartupInfo,
                    ProcessInfo);end.
      

  6.   

    SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
    或者用这句让程序不在任务栏显示
      

  7.   

    客户端是通过导入TLB文件,然后用Com的方法调用
    [code=客户端调用]procedure TForm5.btn1Click(Sender: TObject);
    var
      p:INoWindows;
    begin
      p := CoNoWindows.Create;
      p.Method1;
      p := nil;
    end;[/code]
      

  8.   

    procedure TForm5.btn1Click(Sender: TObject);
    var
      p:INoWindows;
    begin
      p := CoNoWindows.Create;
      p.Method1;
      p := nil;
    end;
      

  9.   

    将DPR文件改为:uses
      Windows, Messages;  //这里只是增加这两个单元,不一定只要这两个。{$R *.res}var
      lpMsg: tagMSG;begin
      while GetMessage(lpMsg, 0, 0, 0) do
      begin
        TranslateMessage(lpMsg);
        DispatchMessage(lpMsg);
      end;
    end.