2009-09-23 37 views
2

我公司有一个大型的Windows应用程序,带有文档对象模型:打开应用程序,打开文件,进行一些更改,保存,关闭。我试图从顶层切掉GUI,并创建一个控制台应用程序,它接受一些参数,打开文件,做一些有用的事情,保存,关闭文件并终止。由于存在大量遗留代码,我不得不使用VCL表单应用程序,并从命令行(或批处理脚本)启动它。我真的需要能够打印到标准输出,因此我可以写出状态消息,响应“--version”和“ - ?”等选项。我花了整整一天的时间在Google上搜索这个主题,但我还没有发现任何有用的信息。VCL表单应用程序写入stdout

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

回答

1

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

+0

嗯,我现在没有使用任何控制台输出,但是当我回到它时我会尝试这个。谢谢。 – 2009-09-24 21:43:09

0

在项目文件中使用{$ 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; 
+1

APPTYPE适用于Delphi,而不适用于C++ Builder。对C++没有同等的含义。乔纳森需要创建一个实际的“控制台”项目,而不是一个GUI项目。 – 2009-09-23 22:34:49

+0

啊。谢谢,雷米,为更正。我想实际的做法是使用控制台功能,在我的回答中,我将乔纳森称为Jonathan。 – 2009-09-24 12:32:09

2

如果你只是想显示在控制台窗口中,你可以调用AllocConsole和FreeConsole然后,你可以调用WriteLn(“XXX”)就像你通常会与一个控制台应用程序。但是,如果从命令行运行此应用程序,它仍然会创建一个新的控制台,标准输出将转到新的控制台而不是调用控制台。

AllocConsole和FreeConsole在Windows单元中原型化。