如何编写 C++ 控制台窗口程序
Posted
技术标签:
【中文标题】如何编写 C++ 控制台窗口程序【英文标题】:How to write a C++ Console-Window Program 【发布时间】:2012-08-28 03:38:11 【问题描述】:我想编写一个 C++ 程序,以便根据配置文件可以是控制台应用程序或窗口应用程序。对于 GUI,我使用的是 WxWidget。我应该分别在 Windows 和 Linux (Buntu) 中做什么。
谁能提供一些简单的例子?
【问题讨论】:
我很困惑,默认情况下所有 C++ 程序都应该通过控制台运行。你在问什么? 在 Windows 中,/SUBSYSTEM 链接器标志定义应用程序是否具有控制台窗口。 AFAIK,在 Linux 中,任何应用程序都可以在终端内或不使用终端执行,因此这不依赖于应用程序本身。 澄清@AlexFarber 所说的:在Windows 上不可能创建一个程序来确定它已经开始运行的子系统。如果您需要支持控制台,请使用main
,然后在您确定应该运行 GUI 时调用FreeConsole
隐藏控制台。控制台仍会弹出,但无法绕过它。
请澄清您的问题。您是否希望配置文件控制应用程序的编译方式,即在构建开始时读取配置,或者应用程序如何运行,即应用程序本身开始运行时。
@Mehrdad:一种常见的解决方法是将代码放在 dll 中,然后将 .exe 与 GUI 子系统一起使用,将 .com 用作控制台子系统。如果你在控制台输入myapp
,它会使用.com,然后让GUI快捷方式指向exe。
【参考方案1】:
在编译阶段使用条件编译很简单。
您的配置文件将包含您想要的预处理器定义。例如
#define GUI
或
#define CONSOLE
然后你将配置文件包含在你想以不同方式编译的每个文件中
#include "gui_or_console.h"
最后,您使用条件编译告诉编译器要处理哪些代码
#idfef GUI
// some GUI code
#endif
#ifdef CONSOLE
// some CONSOLE code
#endif
【讨论】:
【参考方案2】:在运行时执行此操作的典型方法是将程序编译并链接为 Windows 应用程序。在运行时,您读取配置。如果它是为 GUI 设置的,那么创建窗口并按您的方式进行。如果它设置为控制台模式,那么您可以创建一个控制台窗口,将您的 stdout/stdin/sterr 流附加到它,然后就可以开始了。
我编写了一个这样运行的程序。整个 UI 被抽象在一个纯虚拟界面后面,具体实现提供了控制台实现和 GUI 实现。在运行时,我实例化了正确的类型。构造函数生成正确类型的窗口。然后主程序调用一个虚拟的 Run 方法。控制台实现调用 main 的等价物。 GUI 实现运行一个事件循环。
如果你是从命令行启动的(而不是启动你自己的控制台窗口),真正困难的部分是附加到现有的控制台窗口。 Devstudio 通过拥有 devstudio.com 和 devstudio.exe 来做到这一点,但它相当复杂。
【讨论】:
以上是关于如何编写 C++ 控制台窗口程序的主要内容,如果未能解决你的问题,请参考以下文章
怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。