2

我的公司有一个带有文档对象模型的大型 Windows 应用程序:打开应用程序、打开文件、进行一些更改、保存、关闭。我试图从顶部切断 GUI 并创建一个控制台应用程序,它接受一些参数、打开文件、执行一些有用的操作、保存、关闭文件并终止。因为有大量遗留代码,我不得不使用 VCL 表单应用程序并从命令行(或批处理脚本)启动它。我真的需要能够打印到标准输出,这样我才能写出状态消息,响应“--version”和“-?”等选项。我整个上午都在谷歌搜索这个主题,但没有找到任何有用的东西。

该应用程序是使用 VCL 在 CodeGear C++ Builder 2007 中编写的。

4

3 回答 3

2

如果您只想显示一个控制台窗口,您可以调用 AllocConsole 和 FreeConsole 然后您可以像通常使用控制台应用程序一样调用 WriteLn('xxx')。但是,如果您从命令行运行此应用程序,它仍会创建一个新控制台,并且标准输出将转到新控制台而不是调用控制台。

AllocConsole 和 FreeConsole 在 Windows 单元中进行了原型设计。

于 2009-09-30T20:15:30.150 回答
1

您可以在 GUI 程序中写入 STDOUT,通常不会有任何输出,因为没有控制台,除非它是从实际控制台启动的。或者,查看 Win32 API 中的GetStdHandle()WriteConsole()函数。如果GetStdHandle()返回一个有效的句柄,那么你可以写入它。如果您的 GUI 应用程序由另一个想要拦截您的 STDOUT 输出以用于其自身目的的应用程序启动,这将特别有用。

于 2009-09-23T22:39:10.810 回答
0

在项目文件中使用 {$APPTYPE CONSOLE}。这将分配一个控制台(即使您的应用程序仍然基于表单)。

或者,您可以根据项目 (.DPR) 文件中的命令行参数进行分支(Delphi 代码如下 - 由您转换为等效的 C++ Builder)。您仍然需要 APPTYPE 定义,或者您需要使用 Win32 API 控制台函数来创建您自己的控制台(有关更多信息,请参阅MSDN 控制台函数):

begin
  if ParamCount() > 0 then
    DoWhateverTheConsoleAppWouldDoHere()
  else
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end;
于 2009-09-23T19:08:23.903 回答