Иерархия моего проекта такова, что у меня есть 3 процесса.
Главный exe-файл будет вызывать средний exe-файл с помощью createprocess, оттуда средний exe-файл будет вызывать рабочий exe-файл также с помощью createprocess. Как только рабочий exe работает, средний exe завершается.
Я хотел бы быть в состоянии передать выходные данные из рабочего exe обратно в основной exe.
Я считаю, что лучше всего использовать именованный канал в качестве стандартного рабочего.
В основном 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);
}
Тогда в середине отлично у меня
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);
По какой-то причине в Main exe он выдаст «Не удалось установить соединение …», но в моем Middle exe он выдаст «Клиент подключен!».
Я не могу понять, почему Middle exe, кажется, устанавливает соединение, но Main exe не распознает его, когда вызывается ConnectNamedPipe ().
Есть идеи?
Задача ещё не решена.
Других решений пока нет …