编程为控制台和GUI

Hea*_*are 24 delphi console user-interface

是否有可能(如果是这样,我如何)使用Delphi 2007将单个程序作为控制台应用程序和GUI版本工作?

我所追求的是,​​如果程序使用适当的命令行选项运行,它应该用作控制台程序,使用WRITELN将输出打印到控制台,但如果没有给出命令行参数,它应该作为普通Delphi运行GUI应用程序?

问题是当作为控制台应用程序运行时,命令行解释程序在允许您输入新命令之前等待应用程序终止,而从命令行启动的GUI应用程序会立即返回到命令行和GUI应用程序在分离的过程中启动.我希望保留这种行为.

我不介意这样的事情:

如果GUI那么StartApplicationAsGUI(ParamStr(0))

即.我不介意我必须使用某种形式的EXECUTE调用重新启动应用程序,以便在GUI模式下启动它(如果需要),只要命令行界面在GUI版本启动时返回到命令行输入即可.

我更喜欢一个解决方案/建议:

<Parse Comnand Line>
IF ConsoleMode THEN
   RunConsole(参数)
ELSE BEGIN
   Application.Initialize;
   Application.CreateForm(...)
   Application.Run;
结束

(反之亦然,即如果GUI模式以特殊方式做事)

这样我在制作GUI界面时仍然可以使用Delphi的IDE和VCL ......

Joe*_*oey 13

在Windows上这有点棘手.实际上,控制台应用程序和GUI之间的区别是PE标头中的单个标志.你可以轻松编写创建窗口的控制台应用程序,但这样你总是有控制台窗口(你可以隐藏它,但是当人们运行你的程序时这不会很好cmd).

但是,可以使用以下AllocConsole函数编写一个GUI应用程序,以便在需要时创建控制台:

进程只能与一个控制台关联,因此如果调用进程已有控制台,则AllocConsole函数将失败.进程可以使用FreeConsole函数将其自身与其当前控制台分离,然后它可以调用AllocConsole来创建新控制台或AttachConsole以附加到另一个控制台.

如果调用进程创建子进程,则子进程将继承新控制台.

AllocConsole初始化新控制台的标准输入,标准输出和标准错误句柄.标准输入句柄是控制台输入缓冲区的句柄,标准输出和标准错误句柄是控制台屏幕缓冲区的句柄.要检索这些句柄,请使用GetStdHandle函数.

此功能主要由图形用户界面(GUI)应用程序用于创建控制台窗口.无需控制台即可初始化GUI应用程序.控制台应用程序使用控制台初始化,除非它们是作为分离的进程创建的(通过使用DETACHED_PROCESS标志调用CreateProcess函数).

但是,从此处运行cmd时可能会导致出现另一个控制台窗口,而不是重新使用现有控制台窗口.我不知道那里是否存在一个好的解决方案.


Jos*_*ons 12

IMO,这里最好的方法是拥有实际完成程序工作的非可视化类.然后你可以从GUI程序调用它,你也可以从一个单独的命令行程序调用它.这两个程序都只是围绕你的类功能的包装.

这也迫使设计变得干净 - 您的类必须与应用程序的GUI层分开.

  • 这是正确的答案. (2认同)

glo*_*lob 11

http://blogs.msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx

  • 简短的回答(来自这个链接)是:"你不能,但你可以尝试伪造它." (5认同)