Pipe ReadFile blockiert
-
@Wade1234 Ja, Process.WaitForExit() wird beendet. Ich habe enen Breakpoint bei "std::wstring Result=L"";" gesetzt. Der Breakpoint wird erreicht.
-
@philipp95 probier mal SetHandleInformation(Pipe.ReturnWriteHandle(),HANDLE_FLAG_INHERIT,HANDLE_FLAG_INHERIT); in SetHandleInformation(Pipe.ReturnWriteHandle(),HANDLE_FLAG_INHERIT,0); zu ändern. ansonsten gibt es im msdn ein sehr schönes beispiel für die verwendung von pipes.
-
@Wade1234 Ich habe die Zeile in SetHandleInformation(Pipe.ReturnWriteHandle(),HANDLE_FLAG_INHERIT,0); geändert. Dennoch blockiert ReadFile.
-
und ConstructInternal(const_cast<wchar_t*>(Path.c_str()),const_cast<wchar_t*>(Arguments.c_str()),OutputPipe.ReturnWriteHandle()); funktioniert? also eigentlich kannst du char nicht so einfach nach wchar casten.
-
@Wade1234 std::wstring Path,std::wstring Arguments
-
Nur mal eine Vermutung: Du kannst vor ReadFile mit PeekNamedPipe schauen, ob überhaupt etwas zu holen ist (auch ohne zu kopieren). Und anschließend eben solange ReadFile aufrufen, bis die verfügbaren Bytes (lpTotalBytesAvail) abgeholt sind.
Irgendwas war da nämlich...
-
@philipp95 sagte in Pipe ReadFile blockiert:
@Wade1234 std::wstring Path,std::wstring Arguments
ja aber arguments.c_str()? wieso liest du eigentlich immer 2* sizeof(wchar_t)? wird überhaupt etwas aus der pipe gelesen?
@yahendrik sagte in Pipe ReadFile blockiert:
Nur mal eine Vermutung: Du kannst vor ReadFile mit PeekNamedPipe schauen, ob überhaupt etwas zu holen ist (auch ohne zu kopieren). Und anschließend eben solange ReadFile aufrufen, bis die verfügbaren Bytes (lpTotalBytesAvail) abgeholt sind.
Irgendwas war da nämlich...das ist aber eine anonymous pipe, bei der readfile eigentlich mit eof bzw. dem entsprechenden äquivalent returnen sollte, wenn keine daten mehr vorhanden sind.
jedenfalls ist das mal ein schönes beispiel, warum ich lieber mit C bzw. funktionsorientierung programmiere.
-
Pipe? Warum Pipe? Das ist eine normale Datei...
Halte Dich an dieses offizielle Beispiel und es sollte gehen:
https://docs.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output
-
@philipp95 sagte in Pipe ReadFile blockiert:
Hallo, ich habe ein C++-Programm, was die Standardausgabe von net users auslesen soll.
So was hab ich auch mal gemacht:
https://www.c-plusplus.net/forum/topic/248213/system-befehl-ausgabe-umleiten/10
-
Oder einfach popen/_popen/_wpopen verwenden. Geht noch einfacher und ist sogar fast plattformunabhängig. Ob das für dich sinnvoll ist, sei dahingestellt, es ist aber zweifelsohne kürzer.
#include <cstdio> //... static int closePipe(FILE *p) { #if _WIN32 return _pclose(p); #else return pclose(p); #endif }; //eine Klasse, deren Objekt eine Pipe enthält und diese automatisch mit closePipe schließt. using pipeptr = std::unique_ptr<FILE, decltype(&closePipe)>; //führt command aus und gibt dessen errorcode + rückgabewert zurück std::pair<int, std::string> exec(const std::string &command) { #ifdef _WIN32 //2>&1 sorgt dafür, dass stderr nach stdout fließt pipeptr pipe(_popen((command + " 2>&1").c_str(), L"r"), &closePipe); #else pipeptr pipe(popen((command + " 2>&1").c_str(), &closePipe); #endif if(!pipe) ...//fehler, den du aus errno auslesen kannst. std::string output; char buf[512]; while(fgets(buf, sizeof(buf), pipe.get())) output += buf; auto ret = closePipe(pipe.release()); return { ret, output }; }