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