是否可以根据命令或参数创建创建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;
答案 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
新建一个,并专门使用它。但是,您可能最终得到两个控制台,父控制台(如果有的话)和新控制台。做出选择。