我正在使用创建一个子进程CreateProcess
。我在主应用程序中创建了一个管道,我希望它由不是控制台应用程序的子进程使用。
有没有办法做到这一点?我可以使用命令行传递它,但这可能真的是一个糟糕的解决方案!
我正在使用创建一个子进程CreateProcess
。我在主应用程序中创建了一个管道,我希望它由不是控制台应用程序的子进程使用。
有没有办法做到这一点?我可以使用命令行传递它,但这可能真的是一个糟糕的解决方案!
你不需要特殊的技巧。
已测试:当您启动一个带有标准 io 重定向到管道的 GUI 应用程序时,它们就像在控制台应用程序中一样工作:
测试.bat
@echo off
gui.exe | find /v "__nonexist__"
pause
输出:
WriteFile
puts
孩子.c:
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h;
TCHAR tstr[100];
DWORD nb;
h = GetStdHandle(STD_OUTPUT_HANDLE);
_stprintf(tstr, _T("0x%08x"), h);
MessageBox(NULL, tstr, _T("x"), MB_OK);
#define sWriteFile "WriteFile\n"
#define sPuts "puts\n"
if (h) {
WriteFile(h, sWriteFile, sizeof(sWriteFile)-1, &nb, NULL);
fputs(sPuts, stdout);
}
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
return _tmain(0, NULL);
}
当您从控制台启动 GUI 程序时,标准句柄会关闭,但有一种方法可以重新打开它们。此技巧用于 netbeans.exe
使用此处解释的命名管道,并在 .lpCcommandLine 参数中传递管道名称CreateProcess
。
或者(不确定这是否有效,我从未尝试过)将 bInheritHandles 参数设置CreateProcess
为 TRUE 并将句柄作为十六进制值传递给 lpCcommandLine 参数。