Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据参数创建Delphi混合(控制台或GUI)应用程序?_Delphi_Delphi Xe_Hybrid - Fatal编程技术网

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

如何根据参数创建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

是否可以根据命令或参数创建创建delphi应用程序,该应用程序是GUI或控制台应用程序(可以在从命令propt执行时设置命令或参数)

我已经尝试过as流,但它看起来像控制台应用程序,即使我是否传递了参数

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如果您希望在从现有控制台进程调用程序时出现一个新的控制台窗口,那么是的,它会按照您的预期工作。正如你之前的许多人所发现的那样,你试图做的事情不可能完美地完成。正确的折衷办法是有两个可执行文件,每个子系统一个。