Delphi 如何写入控制台窗口进行调试?

Delphi 如何写入控制台窗口进行调试?,delphi,windows-console,Delphi,Windows Console,我可以在应用程序的控制台窗口中显示循环的结果以进行调试吗?最简单的方法是编译为控制台应用程序,但将正常的应用程序框架代码放回dpr中 program Project2; {$APPTYPE CONSOLE} uses Forms, SysUtils, Unit1 in 'Unit1.pas' {Form1}; begin Application.Initialize; Application.CreateForm(TForm1, Form1); writeln('H

我可以在应用程序的控制台窗口中显示循环的结果以进行调试吗?

最简单的方法是编译为控制台应用程序,但将正常的应用程序框架代码放回dpr中

program Project2;

{$APPTYPE CONSOLE}

uses
  Forms,
  SysUtils,
  Unit1 in 'Unit1.pas' {Form1};

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  writeln('Hello, World!');
  Application.Run;
end.
更复杂的方法是使用Windows API AllocConsole调用:

program Project2;

uses
  Forms,
  SysUtils,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  AllocConsole;
  writeln('Hello, World!');
  Application.Run;
end.

如果从命令行调用,此方法(通常)有创建新控制台的缺点。从内存重定向到工作还需要一些代码。的优点是,您可以决定在运行时而不是编译时分配控制台。

如果您编写了控制台应用程序,您可以在控制台应用程序中尝试OutputDebugString函数(我没有尝试)

或者,您也可以捕获控制台应用程序的输出,如中所示


还有,你可以查一下。我使用这些类。我认为它们很棒。

德尔福有一个选项,请检查该项目的链接器选项。标准I/O将被定向到控制台窗口,该窗口将伴随您的GUI应用程序。然后你可以像平常一样使用等

从文档中读取(或):

Delphi程序有一个标准输出 文件,如果它们链接为控制台 应用程序


在Windows中,输出调试信息的最简单方法是使用
OutputDebugString()
,然后使用能够接收该输出的应用程序。DelphiIDE中的事件查看器本身能够接收该输入,或者您可以使用中的应用程序在未安装IDE的系统上获取输出。另外,GExperts也有类似的工具。这是因为GUI应用程序在默认情况下没有写入输出的控制台,否则您必须创建一个控制台(参见Gerry的答案)

OutputDebugString()
的优点之一是,即使调用滑入发布版本(或者故意留在发布版本中),应用程序也可以正常工作,但要小心不要输出敏感信息,因为可以使用上述工具之一读取这些信息

您还可以创建一个临时表单(即,带有一个memo控件)并将输出路由到那里


还有一些高级日志记录功能,如、等。

我认为,如果从控制台调用该程序,这些功能的行为会有所不同。第一个附加到现有的控制台窗口,第二个创建一个新的控制台窗口。附加到第一个控制台通常更容易desirable@CodeInChaos,@David-是的,我忘了提那件事。如果您想重定向输入或输出,这也是一个难题。它的最大优点是,可以在项目中随意执行,这对调试非常有用。设置“生成控制台应用程序”将PE可执行文件标记为控制台应用程序。有关混合可执行文件类型时的一些问题,请参见此处:@ldsandon-我阅读了博客条目,但找不到您提到的问题。你能在这里报价吗?。。FWIW该选项自Delphi 2以来一直存在,我从未遇到过关于该选项的QC报告、投诉或问题。该选项的唯一目的是为GUI应用程序提供标准I/O。进一步阅读:该选项的唯一用途是在PE头中将可执行文件标记为控制台应用程序。例如,请参见“这是ildasm的作者所说的”,关于当您这样做时会发生什么。@ldsandon-这就是选项所做的,我认为这样做是有原因的。。。我看过你之前提到的评论。AFAICS,Delphi的链接器选项没有出现他提到的任何问题:“当从…启动时,不会释放控制台窗口”应该吗?“无法将控制台转储重定向到文件…”Delphi对此没有问题,分配一个文件并重定向输出即可。“瞬间闪烁控制台窗口…”不,不是在Delphi中…更好地阅读那里写的内容:并非所有这些效果都是由于控制台应用程序类型造成的。有些情况发生在从GUI应用程序分配控制台时,有些情况发生在使用控制台应用程序显示GUI时。除非Delphi使用假控制台应用程序(我认为不是),否则发生的事情不是由VCL控制的,而是由Windows本身控制的。如果代码是C,C++或Delphi不是很重要。FWW,我想提到的是,这并不能回答这个问题,那就是“我如何才能编写控制台窗口进行调试?”可能是因为在Windows中写入控制台不是调试的最佳方式。Windows不是Linux或Java。OutputDebugString()绝对是“最简单的”。不过,当你需要“健壮”时,最好用控制台窗口来DIY。在谷歌上搜索“OutputDebugString()有时不可靠,这是多年来我们一直看到的问题”,因为“最简单”和“健壮”是不一样的。如果它不是每次都必须工作,那么OutputDebugString()就可以了。