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



是否可以创建创建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 一起运行,并从 GUI 代码中Writeln/Write它。

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

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

最新更新