我正在使用CreateProcess
创建子进程。我在主应用程序中创建了一个管道,我希望它由不控制台应用程序的子进程使用。
有没有办法做到这一点?我可以使用命令行传递它,但这可能是一个糟糕的解决方案!
答案 0 :(得分:1)
按照here的说明使用命名管道,并在CreateProcess
的lpCcommandLine参数中传递管道名称。
或者(不确定这是否有效,我从未尝试过)将CreateProcess
的bInheritHandles参数设置为TRUE,并将句柄作为十六进制值传递给lpCcommandLine参数。
答案 1 :(得分:1)
你不需要特别的技巧 经过测试:当您使用标准io重定向到管道启动GUI应用程序时,它们就像在控制台应用程序中一样工作:
test.bat的
@echo off
gui.exe | find /v "__nonexist__"
pause
输出:
WriteFile
puts
child.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