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”,并在主应用程序和子进程中使用此名称。