c#将文件指针传递到非托管c++;用于标准输出的dll 请原谅我——我是一个C++经验丰富的C开发人员,这是一个陡峭的学习曲线!

c#将文件指针传递到非托管c++;用于标准输出的dll 请原谅我——我是一个C++经验丰富的C开发人员,这是一个陡峭的学习曲线!,c#,c++,pointers,stdout,C#,C++,Pointers,Stdout,从C控制台应用程序中,我调用了非托管C++ DLL中的一些方法。DLL会写入标准输出流,尽管c#控制台没有接收到 我找到了下面的代码,我把它添加到C++ DLL中,现在它成功地将“Prtff”的内容发送到C控制台。p> #include <windows.h> #include <stdio.h> #include <fcntl.h> #include <io.h> void redirect_stdout() { int hConHandle;

从C控制台应用程序中,我调用了非托管C++ DLL中的一些方法。DLL会写入标准输出流,尽管c#控制台没有接收到

我找到了下面的代码,我把它添加到C++ DLL中,现在它成功地将“Prtff”的内容发送到C控制台。p>

#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

void redirect_stdout()
{
int hConHandle;
long lStdHandle;
FILE *fp;
// allocate a console for this app
AllocConsole();
// redirect unbuffered STDOUT to the console
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
}
当我运行上述版本时,DLL的输出不再通过管道传输到c#控制台,但是c#端的文件流总是空的

任何专家都可以提供指导,让标准输出将其输出写入c#filestream吗?我确信我在如何实现这一点上犯了一些愚蠢的错误,或者我不明白如何实现我正在尝试做的事情

感谢您的时间和投入-非常感谢

[编辑]

OK——我玩得更多了,修改了C++方法:

void redirect_stdout(int passedInHandle)
{
    int hConHandle;
    long lStdHandle;
    FILE *fp;
    // allocate a console for this app
    AllocConsole();

    hConHandle = _open_osfhandle(passedInHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );
}
这也成功地填充了c#流,但是当c#Console应用程序关闭时,应用程序崩溃,出现错误“vshost.exe已停止工作”。这与使用中的方法时的错误相同

非常奇怪的发现:如果我运行控制台应用程序“在visual studio之外”(例如,双击bin文件夹中的.exe),则不会发生崩溃

所以我想我的下一个问题是:我如何追踪这次坠机的源头?它和你有关系吗?从VS运行时,它在调试或发布模式下发生,在VS之外运行时不会发生崩溃


我不知道如何调试这个

> P>您可以考虑使用命名管道:即


希望这能起作用……

Project+属性,调试选项卡,取消选中托管进程选项。@Hans-甚至更奇怪!我刚刚取消选中此选项,并从bin文件夹中删除了相应的文件。当从VS中运行时,应用程序仍会崩溃,并且双击BIN文件夹中的exe即可运行。。。有什么想法吗?这就成功了!谢谢你的想法和有用的链接。
void redirect_stdout(int passedInHandle)
{
    int hConHandle;
    long lStdHandle;
    FILE *fp;
    // allocate a console for this app
    AllocConsole();

    hConHandle = _open_osfhandle(passedInHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );
}