![]() |
Ausgabe einer Konsolenanwendung abfangen (simple Fassung)
Moin moin,
mithilfe von ![]() ![]()
Delphi-Quellcode:
Aufruf-Beispiel:
function Konsole(const Command: String): String;
var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; OutputPipeRead, OutputPipeWrite: THandle; Res: Boolean; BufSize: Cardinal; Buffer: String; BytesRead: Cardinal; begin //Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); //Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.bInheritHandle := true; SecurityAttr.lpSecurityDescriptor := nil; //Pipe erzeugen CreatePipe(OutputPipeRead, OutputPipeWrite, @SecurityAttr, 0); //Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := OutputPipeWrite; StartupInfo.hStdError := OutputPipeWrite; StartupInfo.wShowWindow := SW_HIDE; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; //Prozess erzeugen Res := CreateProcess(nil, PChar(command), nil, nil, true, CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); //OutputPipeWrite schließen CloseHandle(OutputPipeWrite); Result := ''; if Res then begin //OutputPipeRead auslesen SetLength(Buffer, 5000); BufSize := Length(Buffer); repeat Res := ReadFile(OutputPipeRead, Buffer[1], BufSize, BytesRead, nil); Result := Result + Copy(Buffer, 1, BytesRead); until not Res; //auf Prozessende warten WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end; //OutputPipeRead schließen CloseHandle(OutputPipeRead); end;
Delphi-Quellcode:
Grüße
ShowMessage(Konsole('cmd /c dir C:\'));
Malte |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
Hallo.
Ich hätte mir ja gerne noch gewünscht, dass sowas auch gehen würde:
Delphi-Quellcode:
Anstelle das so auszudrücken:
showmessage(Konsole('ver'));
Delphi-Quellcode:
Weitere Vorschläge:
showmessage(Konsole('cmd /c ver'));
- Unter Umständen das Arbeitsverzeichnis setzen? - Und eventuell die Suchpfade des OS berücksichtigen (sofern dies nicht bereits automatisch geschieht). - Falls Anwendung nicht gefunden wird / kein Prozess eröffnet wird: Eine eigen definierte Exception (z.B. ECommandOrFileNotFound) auslösen. -> Kann dann mit try..except behandelt werden, wenn der Benutzer keine Meldung sehen soll. - (Kleinigkeit:) Die Puffergröße 5000 in eine Konstante legen. Was wäre denn überhaupt die komplexe Fassung, wenn das die simple Fassung ist? Gruß blackdrake |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
Zitat:
bei ver handelt es sich um keine Anwendung, sondern um einen Befehl der Windows-Shell. Da die Funktion aber eine Anwendung startet, muss man zunächst die Anwendung cmd starten, um den Befehl auszuführen. Du kannst die Funktion natürlich recht einfach abändern, indem du dem übergebenen String einfach automatisch immer ein 'cmd /c ' voransetzt. Zitat:
Zitat:
Zitat:
![]() Ich komme in nächster Zeit sicherlich nicht dazu, die Funktion zu optimieren - ich habe aber absolut nichts dagegen, wenn Du Dich meinem Code annimmst und ihn verbesserst. Gruß Malte |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
@#1: Funtioniert bestens (Vielen Dank!!!), aber die erste Zeile des zurückgegebenen Strings sollte bei mir so aussehen:
" Datenträger in Laufwerk T: ist T_WIN_XP" sieht bei mir aber leider so aus: " Datentr„ger in Laufwerk T: ist T_WIN_XP" Weshalb kommt das "ä" (vom Wort "Datenträger") als ",," (ist wohl kein doppeltes Komma, sondern ein anderes Zeichen) hier (nur bei mir?) als Rückgabewert raus? Was ist dieses andere Zeichen denn für eines, woher kommt es? Ratlose Grüße peep |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
Das liegt an der unterschiedlichen Codierung zwischen ASCII und ANSI. Abhilfe schaffen da die Funktionen OEMToChar bzw. CharToOEM.
|
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
Zitat:
![]() Grüße Malte Edit:
Code:
Hey - der rote Kasten klemmt. Muss mir OEMToChar bzw. CharToOEM mal ansehen
Zeichen DOS: Westeuropa Windows: Westlich
Ä #$8E #$C4 Ö #$99 #$D6 Ü #$9A #$DC ä #$84 #$E4 ö #$94 #$F6 ü #$81 #$FC |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
@DeddyH und stz:
XP und Vista sind jewils auf NTFS installiert, Delphi7 jeweils auf FAT32, die kompilierten EXE-Ausgaben von D7 werden ebenfalls auf FAT32 ausgegeben und von FAT32 aus gestartet. Was meint ihr mit "den verschiedenen Zeichensätzen von DOS und Windows"? Hier gibt es kein DOS mehr... Mehr Informationen kann ich Euch leider nicht geben, da ich nicht weiß, welche zusätzlichen Infos ihr brauchen würdet :oops: :twisted: Habt ihr trotzdem noch Vorschläge für mich? peep |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
Zitat:
Wenn Du zum Beispiel
Delphi-Quellcode:
aufrufst, startest Du damit die Windows-Eingabeaufforderung. Das ist zwar nicht so ganz dasselbe wie DOS, arbeitet aber auf jeden Fall mit dem Zeichensatz "DOS: Westlich".
Konsole('cmd /c ver')
Du musst also die Zeichen, die dir die Funktion Konsole zurückgibt, vom DOS- in den Windows-Zeichensatz umwandeln. Entweder mit DeddyHs oder meinem Vorschlag. Grüße Malte |
Re: Ausgabe einer Konsolenanwendung abfangen (simple Fassung
Faust in die Tasche, Luft anhalten, bis Zehn zählen!
Danke nochmals für die Tipps und Tricks zur Problemlösung! Besten Dank! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 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-2025 by Thomas Breitkreuz