我已阅读并尝试了许多解决方案,但没有解决我的问题。
我正在用c ++代码生成一个dll,并希望在控制台窗口中显示printf()或std :: cout。为了测试我只是用c ++代码创建一个.exe,但这并没有解决问题!
我知道这个系统(" Pause")是一个坏习惯,但这只是解决同样问题的一种简单方法。而不是调用系统(" Pause")我正在做一个系统() - 调用cl.exe并正在编译一个.c文件的dll(如:system(&) #34; cl ...)。从其他c文件生成的dll没有任何问题。但在我调用系统函数编译dll文件后,printf和std :: out没有显示正确的控制台窗口中的文本。
这是我的示例代码,它搞砸了正确字符的显示:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "Everything works fine\n";
// Calling the cl.exe by cmd...
system("Pause");
std::cout << "now its strewd up the newline is not working\n" << std::endl;
FreeConsole();
return 0;
}
以下是输出图片:
我在调用system()之前和之后尝试了fflush。
所以这是我的进一步想法:
我希望你可以帮助我,也许我错过了什么!
答案 0 :(得分:1)
因此,为了在我的笔记本电脑上尝试这些错误(因为我今天正在旅行),我在笔记本电脑上设置了相同的代码。因为我忘记取消选中Security Development Lifecycle (SDL) checks
时调用freopen("CONOUT$", "w", stdout);
时出错。因为构建visual studio 2015内部代码的错误消息是:
严重级代码说明项目文件行 错误C4996'freopen':此函数或变量可能不安全。请考虑使用freopen_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。 ConsoleApplication1 c:\ users \ noxious \ documents \ visual studio 2015 \ projects \ consoleapplication1 \ consoleapplication1 \ consoleapplication1.cpp 12
我在freopen_s的一个例子中搜索了函数freopen_s,我看到了以下代码Outputting Unicode to Allocated Console Issue:
freopen_s(&stream, "CONOUT$", "w+t", stdout);
我尝试了这个,我的问题解决了!但是不是freopen_s解决了问题它只是它内部"w+t"
所以我查了一下,看到w+
引用了以下类型的访问cstdio: freopen:
“W +” 创建一个用于读写的空文件。如果已存在具有相同名称的文件,则其内容在打开之前将被删除。
所以我尝试了几种组合并得到了这个结果:
wt
无法正常工作w+t
正在工作(但即使您使用w+
,t始终是标准的,与w+t
相同w+
正在工作所以我想我只需要设置一个空文件来进行读写!我将进一步深入研究,因为我不太确定有什么区别,如果在使用dll而不是exe文件时它仍在解决问题! 希望这可能会帮助其他试图解决相同错误的人!但只是一个“+”现在推迟了我的工作超过一天!
编辑5.10.2015: 所以我用“w +”而不是“w”测试了这个函数,它解决了我的问题!即使使用dll而不是生成的exe!
答案 1 :(得分:0)
看起来该过程正在改变控制台上的输出代码页,然后在完成后不再更改它。不确定为什么会发生这种情况,但如果这是原因,那么保存和恢复代码页就足够了:
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "Everything works fine\n";
// Calling the cl.exe by cmd...
UINT codepage = GetConsoleOutputCP();
system("Pause");
SetConsoleOutputCP(codepage);
std::cout << "Should work now." << std::endl;
FreeConsole();
return 0;
顺便说一句,它可能也搞砸了输入代码页。您可以使用GetConsoleCP()
和SetConsoleCP()
。