![]() |
Rückgabewert nach bzw. beim Beenden ausgeben.
Hallo Zusammen!
Als Neuling habe ich gleich mal eine Frage: :roll: Ich würde gerne ein (Win32-)Programm aus der Console mit Parametern starten (soweit kein Problem) und beim Beenden einen Fehlercode (oder eben 0 für keinen Fehler) in die Console zurückschreiben. Was nicht geht ist: FhStdOut := GetStdHandle(STD_OUTPUT_HANDLE); if FhStdOut<>0 then WriteConsole(FhStdOut,PChar(s),Length(s),ulLength, NIL); Hierbei erhalte ich immer FhStdOut=0 Wenn ich eine neue Console öffne, dann kann ich etwas ausgeben. Das Problem ist also, dass ich kein Handle für die Console habe und auch keine Ahnung habe, wo ich dieses herbekomme. Meine Idee war folgende: 1. Ein anderes Programm ruft mein Programm mit einem Parameter auf. 2. Der User benutzt das Programm. (Bis hierher alles OK) 3. Wenn der User das Programm beendet wird ein Rückgabewert an das aufrufende Programm übergeben. Natürlich könnte ich diesen Rückgabewert auch in eine Datei schreiben, es müsste doch aber auch über die Console gehen, oder? Hat mir vielleicht jemand einen Tip? :?: Gruß, StTüff PS: Vielleicht gehört das eher zu "Windows API", vielleicht aber auch nicht?! |
Moin StTüff,
erst einmal herzlich willkommen. Nun zu Deinem Problem: Die Funktion GetStdHandle ist fehlgeschlagen, wenn sie INVALID_HANDLE_VALUE (entspricht -1 bzw. $FFFFFFFF) als Rückgabewert hat. 0 ist in Ordnung. Willst Du jetzt einen Text ausgeben, oder einen Wert für ERRORLEVEL setzen? In letzeren Falle müsste das wunderbar mit der Prozedur HALT(..) gehen. |
Hallo!
Danke für die schnelle Antwort! Ich würde gerne beides machen. Den ExitCode kann das aufrufende Programm verwenden. Soweit OK, dass geht (Danke!). Ich würde aber den Fehlercode auch gerne optisch in der Console anzeigen. Hast Du auch dazu eine Idee! Gruß und noch mal besten Dank! :D StTüff |
Moin StTüff,
funktioniert WriteConsole bei Dir nicht?
Delphi-Quellcode:
Wenn ich hier im Einzelschritt durchgehe, habe ich den Text aus sMessage in der Konsole stehen, nachdem WriteConsole abgearbeitet wurde.
program Project2;
{$APPTYPE CONSOLE} uses sysutils,windows; var hStd : DWORD; sMessage : string; dwDummy : DWORD; begin hStd := GetStdHandle(STD_OUTPUT_HANDLE); if hStd <> INVALID_HANDLE_VALUE then begin sMessage := 'MELDUNG'+#00; WriteConsole(hStd,@sMessage[1],Length(sMessage),dwDummy,nil); end; end. |
Hallo Chris!
Jain! Wenn ich eine Console "erzeuge", (AllocConsole()) dann geht's. Ich schaffe es allerdings nicht in die Console zu schreiben, aus der das Programm aufgerufen wurde. Wichtig ist hierbei noch, dass es sich bei dem Programm nicht um eine Consolenanwendung handelt. Also nicht: {$APPTYPE CONSOLE} Deshalb landet der Text im Nirvana. Ich brauch also ein Handle von der Console, von der der Aufruf gekommen ist. Gruß, StTüff |
Moin StTüff,
das hatt' ich bislang auch noch nicht probiert ;-) Aber ist schon lustig. Selbst wenn ich mit FreeConsole die Konsole freigebe, erhalte ich ein gültiges Handle, sowohl für StdOut, StdErr alsauch für StdIn :shock: Nur ich sehe (wie Deiner Angabe nach zu erwarten war) natürlich nichts :shock: :shock: Vielleicht gibt's ja eine Lösung, aber mit Konsolen (und vor allem deren Verbindung zu nicht-Konsolen Anwendungen) hab' ich mich bislang noch nicht beschäftigt. |
Hallo Chris!
Auf jeden Fall noch mal besten Dank, vielleicht finde ich ja noch einen Weg. (Vielleicht die ganze Anwendung in eine Consolenanwendung kapseln?!) Viele Grüße, StTüff |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz