代码之家  ›  专栏  ›  技术社区  ›  Azad

如何根据参数创建Delphi混合(控制台或GUI)应用程序[[副本]

  •  0
  • Azad  · 技术社区  · 7 年前

    是否可以创建delphi应用程序,它是一个GUI或控制台应用程序,具体取决于命令或参数(命令或参数可以在从command propt执行时设置)

    我尝试过as flows,但它看起来像控制台应用程序,即使我是否传递参数

    if (ParamStr(1) = 'test') then
      begin
        {$APPTYPE CONSOLE}
        WriteLn('Program ConsoleTest is running.');
        WriteLn('Press the ENTER key to stop');
        ReadLn;
      end
      else
      begin
        Application.Initialize;
        Application.MainFormOnTaskbar := True;
        Application.CreateForm(TfrmMain, frmMain);
        Application.Run;
      end;
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Azad    7 年前

    我不确定IDE是否允许这样的代码,但请尝试:

    uses
      Vcl.Forms,
      Winapi.Windows;
    
    function GetConsoleWindow: HWnd; stdcall; 
      external 'kernel32.dll' name 'GetConsoleWindow';
    function AttachConsole(ProcessId: DWORD): BOOL; stdcall; 
      external 'kernel32.dll' name 'AttachConsole';
    
    const
      ATTACH_PARENT_PROCESS = DWORD(-1);
    
    begin
      if ParamStr(1) = 'test' then
      begin
        if not AttachConsole(ATTACH_PARENT_PROCESS) then
          AllocConsole;
        Writeln('Yay! This is a console');
      end
      else
      begin
        Application.Initialize;
        Application.MainFormOnTaskbar := True;
        Application.CreateForm(TForm42, Form42);
        Application.Run;
      end;
    end.
    

    不要使用 {$APPTYPE CONSOLE} 在这里。

    AttachConsole

    AllocConsole 将控制台附加到当前进程。您甚至可以在GUI和 Writeln Write 从您的GUI代码。

    如果你想阻止的话,总是这样 AllocConsole 一个新的,专门用它。但是,您可能会得到两个控制台,父控制台(如果有的话)和新控制台。做你的选择。