Entwickler-Ecke
Windows API - Ausgaben einer DOS-Konsolen App umleiten
Delete - Mi 07.05.03 15:51
Titel: Ausgaben einer DOS-Konsolen App umleiten
Ich möchte gerne die Ausgaben einer DOS-Konsolen Applikation umleiten.
1.) Ich rufe z.B. PKunzip auf und gebe dessen Parameter Datei und Applikationsparameter an. (per ShellExecute)
2.) Pkunzip prüft nun dieses und gibt dies in seinem Fenster aus....
3.) Wie leite ich das Ergebnis auf mein Programm um. Ich denke da z.B. an CreateProcess, habe damit aber keinerlei Erfahrung
Delete - Mi 07.05.03 15:59
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81:
| function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): String; var start: TStartupInfo; procInfo: TProcessInformation; tmpName: string; tmp: Windows.THandle; tmpSec: TSecurityAttributes; res: TStringList; return: Cardinal; begin try tmpName := 'Test.tmp'; FillChar(tmpSec, SizeOf(tmpSec), #0); tmpSec.nLength := SizeOf(tmpSec); tmpSec.bInheritHandle := True; tmp := Windows.CreateFile(PChar(tmpName), Generic_Write, File_Share_Write, @tmpSec, Create_Always, File_Attribute_Normal, 0); try FillChar(start, SizeOf(start), #0); start.cb := SizeOf(start); start.hStdOutput := tmp; start.dwFlags := StartF_UseStdHandles or StartF_UseShowWindow; start.wShowWindow := SW_Minimize; if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True, 0, nil, PChar(_dirName), start, procInfo) then begin SetPriorityClass(procInfo.hProcess, Idle_Priority_Class); WaitForSingleObject(procInfo.hProcess, Infinite); GetExitCodeProcess(procInfo.hProcess, return); CloseHandle(procInfo.hThread); CloseHandle(procInfo.hProcess); Windows.CloseHandle(tmp); res := TStringList.Create; try res.LoadFromFile(tmpName); result := res.Text; finally res.Free; end; Windows.DeleteFile(PChar(tmpName)); end else begin Application.MessageBox(PChar(SysErrorMessage(GetLastError())), 'RunCaptured Error', MB_OK); end; except Windows.CloseHandle(tmp); Windows.DeleteFile(PChar(tmpName)); raise; end; finally end; end;
procedure TForm1.FormCreate(Sender: TObject); var sl: TStringlist; i: Integer; begin s := Runcaptured('C:\', 'ipconfig.exe', '/all'); s := Trim(s); sl := TStringList.Create; try begin sl.Text := s; { Leerzeilen entfernen } for i := sl.Count-1 downto 0 do begin if sl.Strings[i] = '' then sl.Delete(i); end; s := sl.Text; end; finally sl.Free; end; ASCII2Ansi(s); Memo1.Text := s; end; |
Delete - Mi 07.05.03 19:21
Danke ich probiers mal aus
hansa - Do 08.05.03 02:50
ähmm, ging das nicht einfach mit > ? Z.B. "programmname" > PRN an den Drucker :?:
Delete - Do 08.05.03 04:38
| hansa hat folgendes geschrieben: |
| ähmm, ging das nicht einfach mit > ? Z.B. "programmname" > PRN an den Drucker :?: |
Schön und dann scanne ich es wieder ein, um es in mein Programm zu bekommen oder wie? Siehe hier:
| Zitat: |
Wie leite ich das Ergebnis auf mein Programm um.
|
hansa - Do 08.05.03 11:48
dann eben : "programmname" > "Dateiname"
@Luckie: klar, oder einfach scannen :lol:
Delete - Do 08.05.03 14:00
Ganz nett...aber ich habe nicht vor, Ergebnisse in Dateien zu speichern...
hansa - Do 08.05.03 15:17
Du willst also ohne den Umweg einer Datei, aus einer DOS-Box Daten an ein Windows-Programm übergeben :?: Na dann, viel Vergnügen. Und überlege dir mal, was eine Dosbox eigentlich ist und warum die so heißt und immer tiefer in Windows versteckt wird. Das hat schon seine Gründe. 8)
Delete - Do 08.05.03 15:29
hrrm...ja..schlaumeier :wink:
Motzi - Do 08.05.03 15:36
| hansa hat folgendes geschrieben: |
| Du willst also ohne den Umweg einer Datei, aus einer DOS-Box Daten an ein Windows-Programm übergeben :?: Na dann, viel Vergnügen. Und überlege dir mal, was eine Dosbox eigentlich ist und warum die so heißt und immer tiefer in Windows versteckt wird. Das hat schon seine Gründe. 8) |
?? So kompliziert ist das doch gar nicht und außerdem hat Luckie oben doch schon eine fertige Funktion gepostet..!
Eine Konsolte hat ein Input-Handle und ein Output-Handle. Diese Handles kann man nun beliebig setzten und damit die Eingabe/Ausgabe in Files/Pipes/Mailslots etc umleiten. Was andres passiert ja bei den "Operatoren" < und > auch nicht, nur dass da das Sytem die Handles setzt.
hansa - Do 08.05.03 15:49
Hi Motzi,
Luckie macht das ja tatsächlich fast genau so, wie ich es die ganze Zeit skizziere. Ich wollte auf dasselbe hinaus, daß das Konsolenprogramm erst mal alles in eine Datei verfrachtet, was bei Luckie tmpFile etc. ist, und daß Delphi sich dort die Daten abholt und verarbeitet. Und das ganze halt mit > umleitet.
Motzi - Do 08.05.03 16:01
| hansa hat folgendes geschrieben: |
Hi Motzi,
Luckie macht das ja tatsächlich fast genau so, wie ich es die ganze Zeit skizziere. Ich wollte auf dasselbe hinaus, daß das Konsolenprogramm erst mal alles in eine Datei verfrachtet, was bei Luckie tmpFile etc. ist, und daß Delphi sich dort die Daten abholt und verarbeitet. Und das ganze halt mit > umleitet. |
Stimmt, jetzt wo ichs mir näher angesehen hab seh ichs auch.. es ginge aber auch ohne Datei mittels einer Pipe oder eines Mailslot...
Delete - Do 08.05.03 18:32
dat funktioniert im Moment ganz wunderbar...dranbleiben
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!