//Pipes erzeugen CreatePipe(PipeOutputRead, 0); CreatePipe(PipeErrorsRead, 0);

Ähnliche Dokumente
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

Nun öffnet sich das Fenster "Geplante Tasks". Hier zum Einrichten eines neuen Tasks auf "Geplanten Task hinzufügen" klicken. Es öffnet sich der Assist

Delphi Grundkurs Seite 31

Syntax der Sprache PASCAL

Komponente PortIO für Delphi 5.0

Komponente NumEdit für Delphi 5.0

Social Digital Signage - FAQ

Bash-Skripting Linux-Kurs der Unix-AG

Schriftliche Reifeprüfung aus INFORMATIK: Klasse 8D Haupttermin 2002/03

Freiberger Familienkatalog Freiberger Familienbündnis

Bash-Skripting Linux-Kurs der Unix-AG

Erklären Sie kurz die Begriffe Handle und Prozess/Thread im Kontext von Windows 2000.

Informatik GK 12 Klassen Klassen programmieren in Delphi am Beispiel der konkreten Klasse Auto

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

Studienseminar Koblenz - Fachseminar Informatik Visualisierung von Sortieralgorithmen

Komponente PortUSB für Delphi 5.0

Institut für Informatik Christian-Albrechts-Universität zu Kiel. Borland Delphi. Einführung in die Programmiersprache

Typisierte Dateien von Martin Strohal. Einleitung. Der Record

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, mneueintrag, meintrag, morderedlist;

Delphi DLL Tutorial Wie exportiere ich Komponenten aus einer DLL?

Kurs 1613 Einführung in die imperative Programmierung

Komponente QPortUSB für Delphi 2006

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

1 Klassen anlegen und Objekte erzeugen

Ein Softwareprojekt mit Delphi

1 Klassen anlegen und Objekte erzeugen

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Programmieren lernen mit Visual Basic

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

Übung zur Vorlesung Multimedia im Netz

Einstieg in die Informatik mit Java

Programmierkurs: Delphi: Einstieg

Lösungen zu den Übungsaufgaben zu Feldern

Wählen Sie dann den Reiter "Internetzeit" aus und geben Sie als Server die IP- Adresse Ihres Komm-Servers an - diese IP-Adresse lautet <Ihre sc

Einrichtung FTP-Upload Wie richte ich den FTP-Upload unter NetObjects Fusion 8 ein? NetObjects Fusion 8

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

{$MODE Delphi} // fuer Free Pascal unit UCd;

Application Note. Anbindung von Kunden-Software an SpiderControl Web Visualisierung

Einstieg in die Informatik mit Java

Informatik I Übung, Woche 40

Diesen Eintrag mit einem Doppelklick öffnen. Es erscheint das Fenster "Eigenschaften" des entsprechenden Eintrags. Die Eigenschaft "Autoplay deaktivie

Interface. So werden Interfaces gemacht

Subprozesse in Python

VFD-STUDIO. Erhalt von Systeminformationen

Einstieg in die Informatik mit Java

Skripte. Beispiel. M. Fyta Computergrundlagen 73/93

1. Allgemeine Datei (Binärdatei mit formatierten Inhalt)

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Sachinformation. TButton. TLabel. TMemo

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen

Schleifenprogrammierung in C/C++, Fortran und Pascal

Fachbericht DPR. Name: René Wagener. Klasse: CI3O1. Fachlehrer: Herr Balog

Buch-Add-Ons. Jürgen Bayer. Object Pascal-Tipps und Tricks. 1 Konvertieren und auf numerische Werte überprüfen 2

4.Grundsätzliche Programmentwicklungsmethoden

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016

Klausur Fachprüfung Wirtschaftsinformatik Dauer: 2 Stunden. Name:

Borland Delphi 6 -- Kochbuch

Lokales Netzwerk Wie kann ich lokal installierte Drucker im Netzwerk für andere Nutzer freigeben? Frage:

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Funktionen nur wenn dann

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

15 Der strukturierte Datentyp»set«(Mengen)

Informatik-Seminar Thema: Monaden (Kapitel 10)

Header einer IMG-Datei

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Nachklausur am

Musterlösungen zu den RSA-Arbeitsblättern

Von Pascal zu Delphi. Aufbau eines Delphi-Projektes. Grundlagen von ObjectPascal. Prozeduren und Funktionen. Übungen. Ende

E-PRIME TUTORIUM Die Programmiersprache BASIC

Algorithmen und Datenstrukturen II

Inhalt. Dokument Beschreibung. Bentley Technical Support ProStructures.Net - Zusatzprogrammierung Visual Basic Express PST_Bearbeitung_Dialog

Kurs 1575, Musterlösung zur Winter Klausur 2003/04

Modul 122 VBA Scribt.docx

Informatik I Übung, Woche 41

JavaScript und PHP-Merkhilfe

INFORMATIK FÜR BIOLOGEN

Bash-Scripting Linux-Kurs der Unix-AG

Crashkurs Python und Sage U23 Krypto-Mission

saarland Prof. Dr. Andreas Zeller Verantw. Tutor: Florian Groß Übungsblatt 4

Service & Support. Security Status des CP1628 über die Online-Ansicht des Security Configuration Tool (SCT) ermitteln

5.2 Variablenkonzept und elementare Datentypen

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Programmier-Befehle - Woche 10

LWB VIII. Programmieren mit Delphi Zur Laufzeit verwaltete Objekte. Zur Laufzeit verwaltete Objekte. Am Beispiel des bekannten Memory-Spieles

Linux - a bit advanced

Grundlagen von C# - 2

Programmierkurs Java

Transkript:

Wie kann ich die Ausgabe der Konsole in meinem Programm anzeigen? Es ist möglich, aus Delphi heraus einen Kommandozeilenbefehl auszuführen und die Ausgabe, die normalerweise in DOS- bzw. Eingabezeilenfenster erscheint, abzufangen und in einer Stringliste zu speichern. Zentraler Befehl dieses Codes ist CreateProcess. Dieser Win32-API-Befehl erlaubt es, eine Anwendung so detailiert zu starten, dass auch die Ausgabe konfiguriert werden kann (über die Parameter-Struktur StartupInfo). Sie wird hier in eine Pipe (eine Art Datenröhre) umgeleitet, auf die im Beispiel über PipeOutputWrite zugegriffen wird. PipeOutputRead dient anschließend dazu, die dort aufgelaufenen Daten auszulesen und in einen Stream zu schreiben. function GetConsoleOutput(const Command: String; var Output, Errors: T StringList): Boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; PipeOutputRead: THandle; PipeOutputWrite: THandle; PipeErrorsRead: THandle; PipeErrorsWrite: THandle; Succeed: Boolean; Buffer: array [0..255] of Char; NumberOfBytesRead: DWORD; Stream: TMemoryStream; //Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); //Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.bInheritHandle := true; SecurityAttr.lpSecurityDescriptor := nil; //Pipes erzeugen CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); //Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; StartupInfo.wShowWindow := sw_hide; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; Seite 1 / 5

if CreateProcess(nil, PChar(command), nil, nil, true, CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_C LASS, nil, nil, StartupInfo, ProcessInfo) then result:=true; //Write-Pipes schließen CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsWrite); //Ausgabe Read-Pipe auslesen Stream := TMemoryStream.Create; while true do succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytes Read, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); Stream.Position := 0; Output.LoadFromStream(Stream); Stream.Free; CloseHandle(PipeOutputRead); //Fehler Read-Pipe auslesen Stream := TMemoryStream.Create; while true do succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytes Read, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); Stream.Position := 0; Errors.LoadFromStream(Stream); Stream.Free; CloseHandle(PipeErrorsRead); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end else result:=false; CloseHandle(PipeOutputRead); CloseHandle(PipeOutputWrite); Seite 2 / 5

CloseHandle(PipeErrorsRead); CloseHandle(PipeErrorsWrite); Delphi Aufrufbeispiel: Für die Ausgabe und die Fehler wird zunächst eine Stringliste erzeugt. Anschließend wird obige Funktion aufgerufen. Ist sie erfolgreich ausgeführt wurden (Rückgabewert ist true), wird die Output-Stringliste in einem Memo angezeigt. Um Kommandozeilenbefehle ausführen zu können, die keine eigenständigen Anwendungen sind (wie der DOS-Befehl "dir" im folgenden Beispiel) muss der Name des Kommandozeileninterpreters davor stehen. "cmd.exe" ist das unter Windows NT/2000/ XP und "command.com" unter Windows 9x. Der Parameter /c sorgt dafür, dass der Kommandozeilenbefehl ausgeführt und die Kommandozeile anschließend wieder geschlossen wird. procedure TForm1.Button1Click(Sender: TObject); var output, errors: TStringList; output:=tstringlist.create; errors:=tstringlist.create; if GetConsoleOutput('cmd /c dir c:\', output, errors) then Memo1.Lines.AddStrings(output); output.free; errors.free; Weiteres Beispiel: //about.com //09/2001. Capture the Output From a DOS Window { The example runs 'chkdsk.exe c:\' and displays the output to Memo1 Put a TMemo (Memo1) and a TButton (Button1) in your form Put this code in the OnCLick of Button1: } procedure TForm1.Button1Click(Sender: TObject); procedure RunDosInMemo(DosApp:String;AMemo:TMemo); Seite 3 / 5

const ReadBuffer = 2400; var Security : TSecurityAttributes; ReadPipe,WritePipe : THandle; start : TStartUpInfo; ProcessInfo : TProcessInformation; Buffer : Pchar; BytesRead : DWord; Apprunning : DWord; With Security do nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; if Createpipe (ReadPipe, WritePipe, @Security, 0) then Buffer := AllocMem(ReadBuffer + 1); FillChar(Start,Sizeof(Start),#0); start.cb := SizeOf(start); start.hstdoutput := WritePipe; start.hstdinput := ReadPipe; start.dwflags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.wshowwindow := SW_HIDE; if CreateProcess(nil, PChar(DosApp), @Security, @Security, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then repeat Apprunning := WaitForSingleObject (ProcessInfo.hProcess,100); Application.ProcessMessages; until (Apprunning WAIT_TIMEOUT); Repeat BytesRead := 0; ReadFile(ReadPipe,Buffer[0], ReadBuffer,BytesRead,nil); Buffer[BytesRead]:= #0; Seite 4 / 5

Powered by TCPDF (www.tcpdf.org) Delphi OemToAnsi(Buffer,Buffer); AMemo.Text := AMemo.text + String(Buffer); until (BytesRead FreeMem(Buffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(WritePipe); {button 1 code} RunDosInMemo('chkdsk.exe c:\',memo1); Eindeutige ID: #0 Verfasser: Markus Stein Letzte Änderung der FAQ: 2006-02-21 22:22 Seite 5 / 5