【问题标题】:VCL forms application writing to stdoutVCL 形成应用程序写入标准输出
【发布时间】:2009-09-23 18:57:48
【问题描述】:

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

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

【问题讨论】:

    标签: c++ user-interface winapi stdout vcl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 嗯,我最终没有使用任何控制台输出,但当我回到它时我会尝试这个。谢谢。
      【解决方案3】:

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

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

      begin
        if ParamCount() > 0 then
          DoWhateverTheConsoleAppWouldDoHere()
        else
        begin
          Application.Initialize;
          Application.CreateForm(TForm1, Form1);
          Application.Run;
        end;
      end;
      

      【讨论】:

      • APPTYPE 适用于 Delphi,不适用于 C++Builder。没有 C++ 的等价物。 Jonathan 需要创建一个实际的“控制台”项目,而不是 GUI 项目。
      • 啊。谢谢,雷米,更正。我想实际的方法是使用我在回答中提到乔纳森的控制台功能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2012-10-31
      • 1970-01-01
      • 2012-06-08
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多