如何根据参数创建Delphi混合(控制台或GUI)应用程序?
是否可以根据命令或参数创建创建delphi应用程序,该应用程序是GUI或控制台应用程序(可以在从命令propt执行时设置命令或参数) 我已经尝试过as流,但它看起来像控制台应用程序,即使我是否传递了参数如何根据参数创建Delphi混合(控制台或GUI)应用程序?,delphi,delphi-xe,hybrid,Delphi,Delphi Xe,Hybrid,是否可以根据命令或参数创建创建delphi应用程序,该应用程序是GUI或控制台应用程序(可以在从命令propt执行时设置命令或参数) 我已经尝试过as流,但它看起来像控制台应用程序,即使我是否传递了参数 if (ParamStr(1) = 'test') then begin {$APPTYPE CONSOLE} WriteLn('Program ConsoleTest is running.'); WriteLn('Press the ENTER key to st
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}
连接到现有(如父级)控制台
将控制台附加到当前进程。您甚至可以将其与GUI一起运行,并从GUI代码中写入它
请注意,如果存在父控制台,该进程将尝试附加到父控制台。程序将写入该控制台,但它无法控制它。因此,如果有人(很可能是从控制台启动“GUI”程序的人)关闭了父控制台,GUI程序也会关闭(尝试了几次)
如果要防止这种情况发生,请始终
alloconsole
使用一个新的解决方案,并专门使用它。然而,您可能最终拥有两个控制台,一个是父控制台(如果有)另一个是新控制台。请选择。我不确定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}
连接到现有(如父级)控制台
将控制台附加到当前进程。您甚至可以将其与GUI一起运行,并从GUI代码中写入它
请注意,如果存在父控制台,该进程将尝试附加到父控制台。程序将写入该控制台,但它无法控制它。因此,如果有人(很可能是从控制台启动“GUI”程序的人)关闭了父控制台,GUI程序也会关闭(尝试了几次)
如果要防止这种情况发生,请始终
alloconsole
使用一个新的解决方案,并专门使用它。然而,您可能最终拥有两个控制台,一个是父控制台(如果有)另一个是新控制台。做出选择。也可以查看MSDN中的allocsole
。如果您需要与GUI程序关联的控制台,请使用它。你可以随时打电话给它(但只有一次,IIRC)。@azad简单的回答是,你可以假装它,但它不是很令人满意。像Python和其他人一样,创建两个可执行文件。对于Python,Python.exe
以控制台子系统为目标,pythonw.exe
以GUI子系统为目标。如果您需要与GUI程序关联的控制台,请使用它。你可以随时打电话给它(但只有一次,IIRC)。@azad简单的回答是,你可以假装它,但它不是很令人满意。像Python和其他人一样,创建两个可执行文件。对于Python,Python.exe
以控制台子系统为目标,pythonw.exe
以GUI子系统为目标。在哪个模块中alloconsole
comesSee my edit:Winapi.Windows。它是一个布尔型变量函数alloconsole:BOOL;stdcall代码>@David:谢谢。我不知道为什么,但我认为它返回了一个int。@azad如果您希望在从现有控制台进程调用程序时出现一个新的控制台窗口,那么是的,它会按照您的预期工作。正如你之前的许多人所发现的那样,你试图做的事情不可能完美地完成。正确的折衷方案是有两个可执行文件,每个子系统一个。其中模块alloconsole
comesSee my edit:Winapi.Windows。它是一个布尔型变量函数alloconsole:BOOL;stdcall代码>@David:谢谢。我不知道为什么,但我认为它返回了一个int。@azad如果您希望在从现有控制台进程调用程序时出现一个新的控制台窗口,那么是的,它会按照您的预期工作。正如你之前的许多人所发现的那样,你试图做的事情不可能完美地完成。正确的折衷办法是有两个可执行文件,每个子系统一个。