Debugging 将管道句柄传递给子进程

Debugging 将管道句柄传递给子进程,debugging,winapi,createprocess,Debugging,Winapi,Createprocess,我正在使用CreateProcess创建子进程。我已经在主应用程序中创建了一个管道,我希望它被不是控制台应用程序的子进程使用 有没有办法做到这一点?我可以使用命令行传递它,但这可能真的是一个糟糕的解决方案 按照说明使用命名管道,并在CreateProcess的lpccomandline参数中传递管道名称 或者(不确定是否有效,我从未尝试过)将CreateProcess的bInheritHandles参数设置为TRUE,并将句柄作为十六进制值传递给lpccomandline参数。您不需要特殊技巧。

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


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

按照说明使用命名管道,并在
CreateProcess
的lpccomandline参数中传递管道名称


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

您不需要特殊技巧。
测试:启动GUI应用程序时,标准io重定向到管道,它们的工作方式与控制台应用程序中的工作方式相同:

测试蝙蝠

@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);
}
#包括
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
手柄h;
TCHAR tstr[100];
德沃德nb;
h=GetStdHandle(标准输出句柄);
_stprintf(tstr,_T(“0x%08x”),h);
消息框(空,tstr,_T(“x”),MB_OK);
#定义sWriteFile“WriteFile\n”
#定义SPUT“puts”\n
如果(h){
WriteFile(h,sWriteFile,sizeof(sWriteFile)-1,&nb,NULL);
FPUT(开孔、标准孔);
}
返回0;
}
int APIENTH_tWinMain(HINSTANCE HINSTANCE),
HINSTANCE HPPrevenstance,
LPTSTR lpCmdLine,
国际展览(nCmdShow)
{
返回_tmain(0,NULL);
}

当您从控制台启动GUI程序时,标准句柄是关闭的,但有一种方法可以重新打开它们。netbeans.exe中使用了此技巧。恐怕我不允许为此使用命令行。在命令行上传递信息有什么问题?但是,如果不能这样做,可以提供一些唯一的名称,例如“\\\.\\pipe\\myuniquespecialpipename”,并在主应用程序和子进程中使用此名称。