STDERR eines Kommandozeilentools verarbeiten?



  • Hallo Forum,

    ich möchte die Error Ausgabe eines KommandozeilenTools in eine Variable schreiben. Ich habe schon einen VB Source gefunden und ihn so modifiziert das er mir die Ausgabe auf STDERR ausgibt. Bei der Portierung nach C klappt es dann nicht mehr. Die Funktion PeekNamedPipe() sagt das es keinen Ausgabestring gibt.

    #include <windows.h>
    
    int main(void) {
    	const char *sConstCmdStr="java -version";
    	char *sBUFFER, *sCmdStr;
    	SECURITY_ATTRIBUTES sa = {sizeof(sa)};
    	PROCESS_INFORMATION pi = {0};
    	STARTUPINFO si = {sizeof(si)};
    	HANDLE hReadPipe=0, hWritePipe=0;
    	int result, EndRead;
    	DWORD BufferLength=0;
    
    	// Eine Pipe erstellen wo reingeschrieben werden soll.
    	sa.bInheritHandle = 1;
    	sa.lpSecurityDescriptor = 0;
    	result = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
    
    	if (result>0) {
    		si.dwFlags = STARTF_USESHOWWINDOW;
    		si.wShowWindow = 1;
    		si.hStdError = hWritePipe; // Hier die Pipe angeben.
    
    		// Da der cmd String beschreibbar sein muß mache ich eine Kopie:
    		sCmdStr = (char *)malloc(strlen(sConstCmdStr)+1);
    		strncpy(sCmdStr, sConstCmdStr, strlen(sConstCmdStr)+1);
    
    		// Process starten:
    		result = CreateProcess(0, sCmdStr, &sa, &sa, 1, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
    		free(sCmdStr);
    
    		if (result>0) {
    			EndRead = 1;
    
    			// So lange loopen bis Process zu Ende:
    			while (EndRead) {
    				// Länge des Buffers erfahren: (Schlägt fehl)
    				result = PeekNamedPipe(hReadPipe, 0, 0, 0, &BufferLength, 0);
    				if (BufferLength>0) {
    					sBUFFER = (char *)malloc(BufferLength);
    					result = ReadFile(hReadPipe, sBUFFER, BufferLength, 0, 0);
    					if (result>0) {
    						printf("Java String: ", sBUFFER);
    					}
    				} else {
    					EndRead = WaitForSingleObject(pi.hProcess, 0);
    				}
    			}
    		}
    	}
    
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    	CloseHandle(hReadPipe);
    	CloseHandle(hWritePipe);
    }
    

    In dieser Zeile liegt der Unterschied:

    result = PeekNamedPipe(hReadPipe, 0, 0, 0, &BufferLength, 0);
    

    result ist 1, also ok. Aber BufferLength ist 0. Während in VB hier eine Zahl ausgegeben wird. Ausserdem wird in meinem C Programm auf der Konsole die Java Kennung geschrieben, was ja eigentlich in die Pipe gehen sollte. Habt Ihr eine Idee?

    Der Klenk





  • Vielen Dank, hab den Fehler gefunden.


Anmelden zum Antworten