C++ 系统()正在拧紧\n\r\t

C++ 系统()正在拧紧\n\r\t,c++,windows,dll,console-application,C++,Windows,Dll,Console Application,我已经阅读并尝试了许多解决方案,但都没有解决我的问题 < >我从C++代码中生成一个DLL,希望在控制台窗口中显示Prtff()或STD::CUT。对于测试,我只需创建C++代码中的.exe,但这并不能解决问题!p> 我知道系统(“暂停”)是一个坏习惯,但这只是解决同样问题的简单方法。我没有调用system(“Pause”),而是调用system()-调用cl.exe并从.c文件编译dll(比如:system(“cl…”)。从另一个c文件生成dll的工作没有任何问题。但是在我调用编译dll文件的

我已经阅读并尝试了许多解决方案,但都没有解决我的问题

< >我从C++代码中生成一个DLL,希望在控制台窗口中显示Prtff()或STD::CUT。对于测试,我只需创建C++代码中的.exe,但这并不能解决问题!p> 我知道系统(“暂停”)是一个坏习惯,但这只是解决同样问题的简单方法。我没有调用system(“Pause”),而是调用system()-调用cl.exe并从.c文件编译dll(比如:system(“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;
}
#包括“stdafx.h”
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
allocsole();
freopen(“CONOUT$”、“w”、stdout);

std::cout看起来进程正在更改控制台上的输出代码页,然后在完成后不将其更改回。不确定为什么会发生这种情况,但如果这是原因,则应足以保存和恢复代码页:

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;
alloconsole();
freopen(“CONOUT$”、“w”、stdout);

std::cout因此,为了在我的笔记本电脑上尝试这些错误(因为我今天旅行),我在笔记本电脑上设置了相同的代码。因为我忘记取消选中安全开发生命周期(SDL)检查
调用
freopen(“CONOUT$”,“w”,stdout)时出错;
。因为在visual studio 2015内部生成代码时出现的错误消息是:

严重性代码说明项目文件行 错误C496'FRUPENT]:这个函数或变量可能是不安全的。考虑禁用FrOPENGION。使用Oracle CRTYSECURIONNOI警告。详见联机帮助。 我搜索了函数freopen_s,在freopen_s的一个示例中,我看到了以下代码:

我试过这一次,我的问题终于解决了!但解决问题的不是freopen\s,而是它的内部
“w+t”
,所以我查了一下,发现
w+
指的是以下访问类型:

“w+” 创建一个用于读写的空文件。如果已存在同名文件,则在打开该文件之前,其内容将被擦除

所以我尝试了一些组合,得到了这个结果:

  • wt
    不工作
  • w+t
    工作(但即使您使用
    w+
    w+t
  • w+
    工作
所以我想我只需要设置一个空文件来读写!我会更深入地研究这个问题,因为我不太确定区别是什么,当使用dll而不是exe文件时,它是否仍然能解决问题! 希望这可以帮助其他试图解决相同错误的人!但现在只有一个“+”将我的工作延迟了一天多

2015年10月5日编辑: 所以我用“w+”而不是“w”测试了这个函数,它解决了我的问题!甚至用dll而不是生成的exe


当然,代码页不会影响的内部(!)处理ᴄʀ和ʟғ?我对此进行了测试,但它并没有修复输出。如果std::cout如何将\n转换为换行符,我会怎么想。我想我在几年前的it课上已经了解了一些有关它的内容,但仍然记不起它是什么。有没有办法检查转换是否以与它以前起作用了?代码页是正确的,这些字符对应于0x0d和0x0a的表示。控制台窗口上一定有某种模式,告诉它是解释字符还是显示字符。我有同样的想法,但可以找出这将发生的地方。但我认为这是问题所在。另一点是maybe我调用cmd来执行cl.exe错误的实现,我知道,但也许你可以告诉我如何使用createProcess执行相同的cl调用,这将解决问题。在createProcess中,我不太确定应该如何为vs 2010编译器设置环境变量。我只知道有一个批处理文件正在创建此环境在调用cmd内部的cl.exe之前执行的环境。删除
freopen(“CONOUT$,“w”,stdout);
会给出正确的输出。但是它不会显示dll内部的std::cout,对吗?因为我刚刚做了allocsole()然后调用std::cout并没有显示任何内容。freopen用于将stdout引用到分配的控制台?我不知道您试图用
alloconsole
freopen
实现什么,但是如果没有它们,它工作得非常好。您为什么希望需要它们?正如我在问题中所写的,norm这是一个DLL生成的代码,它将从一个C++项目中调用,但是,当调用一个命令窗口内部的C++.DLL时,我希望得到相同的显示。一个dll和freopen正在将标准输出流链接到命令窗口。好的,如果我理解正确,您希望有一个
dll
,它将从没有控制台窗口的
EXE
调用,但您希望
dll
有一个可见的控制台窗口,以便您可以看到它的输出。您希望这样做而不使用e> cmd.exe
。正确吗?
freopen_s(&stream, "CONOUT$", "w+t", stdout);