Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从控制台运行时WinMain的管道控制台输出_C++_C++builder_Vcl_Winmain - Fatal编程技术网

C++ 从控制台运行时WinMain的管道控制台输出

C++ 从控制台运行时WinMain的管道控制台输出,c++,c++builder,vcl,winmain,C++,C++builder,Vcl,Winmain,我正在尝试从控制台将WinMain函数的标准输出通过VCL窗体应用程序传输 特别是,我需要在控制台中执行此操作: mywinprogram.exe -v > toMyFile.txt 其中-v代表版本。传递的信息只是应用程序的版本 我可以使用下面的答案将结果输出到控制台: 但是,将输出管道化到文件是不起作用的 当在没有任何参数的情况下启动时,应用程序的行为应类似于“正常”windows应用程序 以这种方式获取信息的能力是用于自动构建系统的工作。这是我在的答案中找到的版本 调用此函数是

我正在尝试从控制台将WinMain函数的标准输出通过VCL窗体应用程序传输

特别是,我需要在控制台中执行此操作:

mywinprogram.exe -v > toMyFile.txt 
其中-v代表版本。传递的信息只是应用程序的版本

我可以使用下面的答案将结果输出到控制台:

但是,将输出管道化到文件是不起作用的

当在没有任何参数的情况下启动时,应用程序的行为应类似于“正常”windows应用程序


以这种方式获取信息的能力是用于自动构建系统的工作。

这是我在的答案中找到的版本

调用此函数是您在中所做的第一件事<代码>\u tWinMain():

#包括
#包括
#包括
void重定向iotoconsole(){
if(AttachConsole(ATTACH\u PARENT\u PROCESS)==false)返回;
句柄控制台输出=GetStdHandle(标准输出句柄);
int SystemOutput=_open_osfhandle(intptr_t(控制台输出),_O_TEXT);
//检查输出是否为控制台且未重定向到文件
if(isatty(SystemOutput)==false)返回;//如果不是TTY则返回
文件*COutputHandle=_fdopen(系统输出,“w”);
//获取STDERR句柄
句柄控制台错误=GetStdHandle(标准错误句柄);
int SystemError=_open_osfhandle(intptr_t(控制台错误),_O_TEXT);
文件*CErrorHandle=_fdopen(系统错误,“w”);
//获取标准文本句柄
手柄控制台输入=GetStdHandle(标准输入手柄);
int SystemInput=_open_osfhandle(intptr_t(控制台输入),_O_TEXT);
文件*CInputHandle=_fdopen(SystemInput,“r”);
//使cout、wcout、cin、wcin、wcerr、cerr、wclog和clog也指向控制台
ios::与stdio同步(true);
//将CRT标准输入、输出和错误句柄重定向到控制台
freopen_s(&CInputHandle,“CONIN$”,“r”,标准);
freopen_s(&COutputHandle,“CONOUT$”、“w”、stdout);
freopen_s(&CErrorHandle,“CONOUT$”、“w”、stderr);
/清除每个C++标准流对象的错误状态。
std::wcout.clear();
std::cout.clear();
std::wcerr.clear();
标准::cerr.clear();
std::wcin.clear();
std::cin.clear();
}

会发生什么情况?@nsm将输出发送到控制台并创建文件empty@TedLyngmo我用了你的答案,让它起作用了。我正要颁发答案,但看起来你把它从帖子上删除了?@Tottekarsson哦,真的吗?:-)我删除了它,因为我认为它不工作:-D现在取消删除。感谢您的回复!不允许此应用程序生成额外的控制台。仅在请求时将某些信息输出到控制台(该信息用于自动生成系统)。任何一种抑制额外控制台产卵的方法?“TotTekCalss',这正是我正在寻找的:-”我几乎可以肯定我在C++ Builder 4中做了类似的事情,但是那是很久以前的事了。哦,好吧,当雷米看到这个,他会解决的。我试过你的方法,效果很好。完美的不过,我正在更新我的问题,以定义更多所需的行为。@Tottekarsson新版本。。。这似乎在WSL(Windows上的UNBOND)提示符下起作用,但在经典的
CMD.EXE
提示符下不起作用…:-/确认这适用于powershell和bash控制台,但不适用于“常规”cmd控制台。
#include <cstdio>
#include <fcntl.h>
#include <io.h>

void RedirectIOToConsole() {
    if (AttachConsole(ATTACH_PARENT_PROCESS)==false) return;

    HANDLE ConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    int SystemOutput = _open_osfhandle(intptr_t(ConsoleOutput), _O_TEXT);

    // check if output is a console and not redirected to a file
    if(isatty(SystemOutput)==false) return; // return if it's not a TTY

    FILE *COutputHandle = _fdopen(SystemOutput, "w");

    // Get STDERR handle
    HANDLE ConsoleError = GetStdHandle(STD_ERROR_HANDLE);
    int SystemError = _open_osfhandle(intptr_t(ConsoleError), _O_TEXT);
    FILE *CErrorHandle = _fdopen(SystemError, "w");

    // Get STDIN handle
    HANDLE ConsoleInput = GetStdHandle(STD_INPUT_HANDLE);
    int SystemInput = _open_osfhandle(intptr_t(ConsoleInput), _O_TEXT);
    FILE *CInputHandle = _fdopen(SystemInput, "r");

    //make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
    ios::sync_with_stdio(true);

    // Redirect the CRT standard input, output, and error handles to the console
    freopen_s(&CInputHandle, "CONIN$", "r", stdin);
    freopen_s(&COutputHandle, "CONOUT$", "w", stdout);
    freopen_s(&CErrorHandle, "CONOUT$", "w", stderr);

    //Clear the error state for each of the C++ standard stream objects.
    std::wcout.clear();
    std::cout.clear();
    std::wcerr.clear();
    std::cerr.clear();
    std::wcin.clear();
    std::cin.clear();
}