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