将PIPE句柄传递给子进程

时间:2013-08-13 09:06:26

标签: debugging winapi createprocess

我正在使用CreateProcess创建子进程。我在主应用程序中创建了一个管道,我希望它由控制台应用程序的子进程使用。

有没有办法做到这一点?我可以使用命令行传递它,但这可能是一个糟糕的解决方案!

2 个答案:

答案 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