我有一个DLL,我使用AllocConsole()和cout来显示数据以进行调试.
它曾经工作正常但是因为我将我的编译器(Visual Studio 2012)更新到最新的dll只显示控制台而不是print/couts.
我不明白为什么会发生这种情况.
有任何想法吗?
我的部分代码
__declspec(dllexport) INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
AllocConsole();
DisableThreadLibraryCalls(hDLL);
//
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pSend, MySend);
if(DetourTransactionCommit() == NO_ERROR)
cout << "[" << MySend << "] successfully detoured." << endl;
Run Code Online (Sandbox Code Playgroud)
但是什么都没有显示
我正在使用正在向cout或打印警告消息的库cerr.我不希望此警告消息到达我的程序的输出.如何捕获此输出并将其输入/dev/null或类似?
MWE:
#include <iostream>
void foo()
{
std::cout << "Boring message. " << std::endl;
};
int main()
{
foo();
std::cout << "Interesting message." << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出应该是:
Interesting message.
Run Code Online (Sandbox Code Playgroud)
我main该如何修改以获得所需的输出?(foo不得更改.)
我尝试使用freopen()并fclose(stdout)按照此问题中的建议如何将stdout重定向到Windows应用程序中的某些可见显示?.结果是没有打印任何内容.
如果我选择创建一个Windows非控制台应用程序,并printf\cout在代码中实现,那么printf\cout写在哪里?它写入stdout缓冲区吗?如果是的话,无论如何都要从中读取它stdout并将其打印到某个文本文件中或者MessageBox使用文本进行读取(只是为了验证我是否正确读取了它)?
编辑::只是为了澄清我不想将输出重定向到任何地方.我想知道,printf/cout写在哪里?如果它写入某个默认缓冲区,是否有办法读取输出,只是为了验证我已经从正确的缓冲区读取了正确的输出.请不要给我重定向"stdout"的解决方案.
默认情况下,libavformat将错误消息写入stderr,如:
Estimating duration from bitrate, this may be inaccurate
我怎么能把它关掉?或者更好的是,把它管道到我自己的整洁记录功能?
编辑:将stderr重定向到其他地方是不可接受的,因为我需要它用于其他日志记录目的,我只是希望libavformat不写入它.
我需要将所有程序输出写入文本文件.我相信它是这样做的,
sOutFile << stdout;
Run Code Online (Sandbox Code Playgroud)
其中sOutFile是创建文件的ofstream对象,如下所示:
sOutFile("CreateAFile.txt" ); // CreateAFile.txt is created.
Run Code Online (Sandbox Code Playgroud)
当我将stdout插入sOutFile对象时,我得到一些似乎相似的代码 八进制 [十六进制]代码或我创建的文本文件中的某种地址.
0x77c5fca0
Run Code Online (Sandbox Code Playgroud)
但令我困惑的是,在我的程序中,我多次使用cout.主要是文字陈述.如果我没弄错那就是程序输出.
如果此代码是地址,它是否包含我的所有输出?我可以把它读回到程序中并找到那个方法吗?
如何将我的所有程序输出写入文本文件?
可以使用cout语法显示Windows消息框吗?
我还需要压缩/隐藏命令提示符窗口.
有一些方法可以调用消息框功能并通过其用法显示文本,但这里的主要约束是必须使用cout语法.
cout << "message";
Run Code Online (Sandbox Code Playgroud)
我想在cout输出中调用VB msgbox命令,但找不到任何有用的东西.
有任何想法吗?
当我调用此代码时:
QScriptEngine e;
e.evaluate("print('hello, world!')");
Run Code Online (Sandbox Code Playgroud)
输出文本(来自print方法)写入主应用程序的终端.
有没有办法将其重定向到自定义QIODevice?
这是我在这里的第一个问题!
我即将将一些工作良好的 C++ 代码从 UNIX 移植到 Windows,它通过管道将 stdout 和 stderr 重定向到自定义 GUI 组件。我需要它来显示来自第三方库的反馈,该库仅将消息输出到我的 GUI 上的 stdout。
根据这个答案/sf/answers/43201091/这应该有效。事实上,链接中的代码在使用 Visual Studio 2017 构建的新命令行应用程序中按预期工作。但是在我现有的 GUI 应用程序中,对 的调用_fileno(stdout)以及对_fileno(stderr)两者的调用都返回 -2 而不是预期值 1 和 2,所以只需什么都没有发生。对相关函数进行硬编码 1 和 2 也不起作用。
所以谁能解释一下
供您参考,我收集了迄今为止在 Linux 和 Mac OS 上编程的主要经验,因此对于经验丰富的 Windows 人员来说,这可能是显而易见的。GUI 应用程序基于 JUCE 框架,因此我使用的是由 JUCE 工具 Projucer 创建的自动生成的 Visual Studio 项目
c++ ×7
c ×2
stdout ×2
windows ×2
cout ×1
dll ×1
ffmpeg ×1
file-io ×1
libav ×1
libavcodec ×1
libavformat ×1
messagebox ×1
pipe ×1
qt ×1
qtscript ×1
visual-c++ ×1
winapi ×1