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

how to create Delphi hybrid (console or GUI) application depending on a parameter?

是否可以根据命令或参数创建 Create delphi 应用程序,它是 GUI 或控制台应用程序(可以在从命令提示执行时设置命令或参数)

我试过作为流程,但它看起来像控制台应用程序,即使我是否传递参数也是如此

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;

我不确定 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 代码到它。

请注意,该进程会尝试连接到父控制台(如果有的话)。该程序将写入该控制台,但不控制它。因此,如果有人(很可能是从控制台启动 "GUI" 程序的人)关闭了该父控制台,则 GUI 程序也会关闭(尝试了几次)。

如果你想避免这种情况,总是 AllocConsole 一个新的并且只使用它。然而,您最终可能会得到两个控制台,父控制台(如果有的话)和新控制台。做出你的选择。