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

时间:2018-10-02 10:36:28

标签: delphi delphi-xe hybrid

是否可以根据命令或参数创建创建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;

1 个答案:

答案 0 :(得分:2)

我不确定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一起运行,并从GUI代码对其Writeln / Write进行运行。

请注意,该进程尝试附加到父控制台(如果有)。该程序将写入该控制台,但不会对其进行控制。因此,如果某个人(很可能是从控制台启动“ GUI”程序的人)关闭了该父控制台,则GUI程序也会关闭(尝试了几次)。

如果您想避免这种情况,请始终AllocConsole新建一个,并专门使用它。但是,您可能最终得到两个控制台,父控制台(如果有的话)和新控制台。做出选择。