2016-05-29 24 views
0

Ich versuche ein System zu implementieren, wo eine beliebige Anzahl von Prozessen über Named Pipes miteinander kommunizieren würde. Die Implementierung erfolgt in C++ in Windows. Ich stecke jedoch fest, weil die Prozesse anscheinend keine Nachrichten empfangen können. Ich konnte keine ähnliche Frage finden, ich entschuldige mich, wenn es schon gefragt wurde. Wie auch immer, hier ist der Code für die Erstellung von Handles. Die Idee ist, dass ich n (n = ca. 5 oder 6) Prozesse habe und jeder Prozess hat eine benannte Pipe zum Schreiben (PipesIn) und Lesen (PipesOut).ERROR_INVALID_HANDLE beim Aufruf von ConnectNamedPipe

pipesIn = std::vector<HANDLE *>(); 
    pipesOut = std::vector<HANDLE *>(); 
    this->name = name; 
    wchar_t pipeName[20]; 
    for (int i = 0; i < total; i++) { 
     if (i != name) { 
      HANDLE hIn; 
      swprintf(pipeName, L"\\\\.\\pipe\\Pipe(%d,%d)", name, i); 
      do { 
       hIn = CreateNamedPipe(pipeName, 
        PIPE_ACCESS_DUPLEX | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
        PIPE_WAIT, 
        1, 
        1024 * 16, 
        1024 * 16, 
        NMPWAIT_USE_DEFAULT_WAIT, 
        NULL); 
      } while (hIn == INVALID_HANDLE_VALUE); 
      pipesIn.push_back(&hIn); 
     } 
    } 

    for (int i = 0; i < total; i++) { 
     if (i != name) { 
      HANDLE hOut; 
      swprintf(pipeName, L"\\\\.\\pipe\\Pipe(%d,%d)", i, name); 
      do { 
       hOut = CreateFile(pipeName, 
        GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL, 
        OPEN_EXISTING, 
        0, 
        NULL); 
      } while (hOut == INVALID_HANDLE_VALUE); 
      pipesOut.push_back(&hOut); 
     } 
     else { 
      pipesIn.push_back(NULL); 
      pipesOut.push_back(NULL); 
     } 
    } 

Das Problem, das ich habe, ist in meiner Empfangsfunktion. Wenn ich ConnectNamedPipe aufrufen, ist Ergebnis 0, und GetLastError() gibt ERROR_INVALID_HANDLE zurück.

Da ich irgendwie neu in C++ bin und Rohre benutze, ergibt das für mich nicht viel Sinn. Ich habe versucht, die Methode der Kommunikation Beispiel here zu replizieren. Jede Art von Rat wird als nützlich erachtet.

Antwort

2

Sie haben sich in den Fuß geschossen, indem Sie die Dinge unnötigerweise komplizierter gemacht haben.

 pipesIn.push_back(&hIn); 

Dies ist Ihr Problem. hIn ist eine stack-lokale Variable, die am Ende des Bereichs verschwindet, aber Sie nehmen die Adresse dieser Position auf dem Stapel und speichern sie.

Die Lösung ist für Sie, um Ihre Vektoren einfach zu std::vector<HANDLE>; GRIFFE sind in erster Linie sehr kleine Objekte, die die gleiche Größe wie ein Zeiger haben, also tun Sie sich keinen Gefallen, indem Sie sie nach Adresse nehmen.

Verwandte Themen