如何将命名管道传递给CreateProcess(C ++ Windows)

时间:2017-02-13 21:15:29

标签: c++ windows pipe named

我的项目的层次结构是我有3个进程。

  1. 主要的exe
  2. 中间执行
  3. 工人执行
  4. 主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无法识别它。

    有什么想法吗?

0 个答案:

没有答案