我的项目的层次结构是我有3个进程。
主exe将使用createprocess生成中间exe,从中间exe将使用createprocess生成worker exe。一旦worker exe运行,中间exe终止。
我希望能够将worker exe的输出数据传递给main exe。
我认为最好的方法是使用命名管道作为worker exe的stdout。
在主exe中我有这段代码:
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, static_cast<PACL>(0), FALSE);
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = FALSE;
HANDLE hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MPipe"),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT,
PIPE_UNLIMITED_INSTANCES,
1024 * 4,
1024 * 4,
0,
&sa);
//CreateProcess() code here for middle exe
if (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE) {
MessageBoxA(NULL, "Failed to create pipe", NULL, MB_OK);
}
int count = 0;
while (true) {
if (!ConnectNamedPipe(hPipe, 0)) {
std::this_thread::sleep_for(std::chrono::seconds(20));
count++;
}
if (count > 5)
break;
}
if (count > 5) {
MessageBoxA(NULL, "Failed...", NULL, MB_OK);
}
然后在中间exe我
memset(&si, 0x00, sizeof(si));
memset(&pi, 0x00, sizeof(pi));
si.cb = sizeof(si);
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hPipe;
BOOL keepGoing = TRUE;
while(keepGoing){
hPipe = CreateFile(TEXT("\\\\.\\pipe\\MPipe"),
GENERIC_WRITE | GENERIC_READ,
0,
&sa,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
if (GetLastError() == ERROR_PIPE_BUSY) {
MessageBoxA(NULL, "Pipe busy...", NULL, MB_OK);
WaitNamedPipe("\\\\.\\pipe\\MPipe", 2000);
}
else {
MessageBoxA(NULL, "Failed to open pipe for writing", NULL, MB_OK);
break;
}
}
else {
keepGoing = FALSE;
}
}
MessageBoxA(NULL, "Client pipe connected!", NULL, MB_OK);
SetHandleInformation(hPipe, HANDLE_FLAG_INHERIT, 0);
si.hStdError = hPipe;
si.hStdOutput = hPipe;
processFlags = CREATE_SUSPENDED;
CreateProcessW(processPath, commandLine, NULL, NULL, TRUE, processFlags, NULL, NULL, &si, &pi);
由于某些原因,在主程序中,它将输出“无法建立连接...”但在我的中间执行程序中,它将输出“客户端连接!”。
我无法弄清楚为什么Middle exe似乎建立了连接,但是当调用ConnectNamedPipe()时,Main exe无法识别它。
有什么想法吗?