我想创建一个可以作为CLI或GUI应用程序运行的C#程序,具体取决于传递给它的标志.可以这样做吗?
我找到了这些相关的问题,但它们并不完全涵盖我的情况:
我有一个相对较旧的应用程序.通过一些小的改动,它几乎完全用Visual C++ 2008构建.我注意到的一件事是我的"调试控制台"工作不正常.基本上在过去,我AllocConsole()用来为我的调试输出创建一个控制台.然后我会用它freopen来重定向stdout到它.这与C和C++风格的IO完美配合.
现在,它似乎只适用于C风格的IO.将内容重定向cout到分配的控制台的正确方法是什么AllocConsole()?
这是以前的代码:
if(AllocConsole()) {
freopen("CONOUT$", "wt", stdout);
SetConsoleTitle("Debug Console");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发生的一件事是我可以创建一个自定义streambuf,其溢出方法使用C样式IO写入并std::cout用它替换默认的流缓冲区.但这似乎是一个警察.有没有正确的方法在2008年这样做?或者这可能是MS忽略的东西?
编辑2:好的,所以我已经实现了上面拼写的想法.基本上它看起来像这样:
class outbuf : public std::streambuf {
public:
outbuf() {
setp(0, 0);
}
virtual int_type overflow(int_type c = traits_type::eof()) {
return fputc(c, stdout) == EOF ? traits_type::eof() : c;
}
};
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
// create the console …Run Code Online (Sandbox Code Playgroud) 我有一个GUI应用程序,我正在为Linux和Windows开发跨平台.在Linux上,一切顺利.但是,我在Windows上遇到了麻烦.我希望能够使用Windows上的GUI应用程序将某些消息记录到控制台,Linux风格.
我所说的Linux风格是,如果从控制台打开程序,输出将转到控制台,但如果程序打开,例如,通过开始菜单,用户将永远不会看到控制台输出.显然,这比在Windows上听起来更难.
目前,我在main()中使用以下技巧:
#if _WINDOWS /* Fix console output on Windows */
if (AttachConsole(ATTACH_PARENT_PROCESS)) {
freopen("CONOUT$","wb",stdout);
freopen("CONOUT$","wb",stderr);
}
#endif
Run Code Online (Sandbox Code Playgroud)
这允许我在程序实际打开窗口之前创建输出,例如从命令行响应"--help".但是,一旦窗口实际初始化并由我的程序打开,则返回控制台.我需要一个解决方案,允许我在程序的整个生命周期内继续访问控制台,如果最初没有使用,则无需打开新的控制台.
背景:我们开发了win32应用程序,并在Windows上使用"Thompson Toolkit"为我们提供了一个类似于unix的shell,我们将它们用作命令行.
我们有一个GUI程序(带有WinMain和消息循环),我们想要写入控制台,但printf等不起作用,即使我们从控制台启动程序.我们如何从GUI程序写入控制台?我们需要在那里打印文本,以便自动构建系统可以显示错误消息等.
谢谢.