Programm blockiert bei Aufruf von ReadFile an Pipe
-
Ich vermute schon. Ich starte einfach "net.exe" mit dem Argument "users". Ich nehme an, dass das was rein schreibt.
norbertwill
-
Ich habe es jetzt gelöst: hWritePipe muss vor dem Lesen mittels ReadFile mit CloseHandle geschlossen werden.
Das geht wie folgt:
CloseHandle(hWritePipe);
norbertwill
-
Es muss auch noch dwMask durch HANDLE_FLAG_INHERIT ersetzt werden.
Jetzt habe ich ein ganz anderes Problem: ReadFile schlägt fehl, wenn ich Daten daraus mit ReadFile lesen will. GetLasatError gibt in dem Beispiel FALSE zurück und GettLastError liefert Fehler 109. Mein Aufruf sieht wie folgt aus:
DWORD dwRead=0; SetLastError(ERROR_SUCCESS); CHAR Buffer; BOOL bReadFile=ReadFile(hReadPipe,(LPVOID) &Buffer,1,&dwRead,0); DWORD dwLastError=GetLastError();
norbertwill
-
Die Pipe ist zu und beendet:
ERROR_BROKEN_PIPE 109 (0x6D)
The pipe has been ended.Was machst Du eigentlich? Entsprechenden Code um die Ausgabe umzuleiten gibt es doch wie Sand am Meer.
-
Ich versuche aktuell die Ausgabe von net users umzuleiten.
norbertwill
-
Und? Hast Du Dich an die im Netz existierenden Samples gehalten.
Zudem Warm führst Du Net Users aus, wenn man das auch direkt machen kann mit der API?
EDIT: Der Code funktioniert zu 100%
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
-
Soweit ich weiß, habe ich mich an im Internet vorhandene Beispiele gehalten.
Entsprechenden Code habe ich ja schon gepostet.
Hat jemand anhand meines Codes oder allgemein eine Idee, wie man meinen Code verbessert? Ich würde mich sehr über eure Hilfe freuen.norbertwill
-
Net.exe ist für mich nur ein Beispiel für ein Kommandozeilenprogramm. Mir geht es nicht speziell um die Ausgabe dieses Programmes.
norbertwill
-
Dein Code ist unvollständig und die Beispiele weitaus komplexer als was Du uns zeigst. Zeige mehr Code. Dann bekommst Du evtl. mehr Infos.
Ansonsten: Warum verwendest Du nicht den Link, den ich Dir gesendet habe als Copy&Paste, ich verwende ihn selbst in einer Klasse erfolgreich.
-
Danke Martin, das Problem war, dass zwei Destructoren meiner zweier Klassen zu früh aufgerufen wurden und so derselbe Handle zu der Pipe zwei Mal mit jeweils CloseHandle geschlossen wurde. Ich habe schließlich den Code so angepasst, sodass die Destructoren nicht verfrüht aufgerufen wurden.
Ich habe nun allerdings das der Aufruf von ReadFile mit dem Handle der Piupe fehlschlägt und GetLastError den Fehler 5 (Zugriff verweigert) zurückgibt.
norbertwill
-
Ich meinte natürlich "Pipe".
norbertwill
-
So, ich habe das jetzt auch mit dem .NET-Framework probiert und es liefert eine Win32Exception mit ebenfalls 5 als NativeErrorCode.
norbertwill
-
Ich habe das Programmm in C# komplett neu geschriebern. Nun gibt es keine Exception mehr.
norbertwill
-
norbertwill schrieb:
Net.exe ist für mich nur ein Beispiel für ein Kommandozeilenprogramm. Mir geht es nicht speziell um die Ausgabe dieses Programmes.
Vielleicht hilft Dir das hier weiter:
http://www.c-plusplus.net/forum/248213-full
-
Vielen Dank für die Antwort. Ich wollte allerdings Windows API Funktionen verwenden.
norbertwill
-
Jo, die werden doch in der Lösung in obigem Beitrag zu Hauf verwendet.
-
Stimmt, ich hatte mich wohl geirrt. Jetzt ist das Thema wohl erledigt. Danke!
norbertwill