1

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

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

4

2 回答 2

1

你不需要特殊的技巧。
已测试:当您启动一个带有标准 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

于 2013-08-13T15:56:07.003 回答
1

使用此处解释的命名管道,并在 .lpCcommandLine 参数中传递管道名称CreateProcess

或者(不确定这是否有效,我从未尝试过)将 bInheritHandles 参数设置CreateProcess为 TRUE 并将句柄作为十六进制值传递给 lpCcommandLine 参数。

于 2013-08-13T09:25:12.373 回答