Entwickler-Ecke

Windows API - Konsolen-Ausgaben in eigenes Programm umleiten


Frankieboy - Di 04.03.08 15:43
Titel: Konsolen-Ausgaben in eigenes Programm umleiten
Hallo,

ich hab ein Windows-Programm geschrieben, dass eine Konsolenanwendung (openssl.exe) startet und Parameter übergiebt.
Die Konsole ansich bleibt dem Benutzer verborgen.
Allerdings will ich aus Debuggründen die Text-Ausgabe der openssl.exe in mein Programm umleiten - erstmal in ein Memo...

Aber wie?

Hier mal die Funktion, mit der ich programmintern die "DOS"-Konsolenanwendungen starte:

Delphi-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:
function TFormGenerate.ExecAndWait_New(const FileName, Params: String): Integer;
var w: Cardinal;
    ExecuteInfo: TSHELLEXECUTEINFO;
{Return-Values der Funktion:
    -3: Kein Programm mit dieser Dateierweiterung verknüpft
    -2: Datei nicht gefunden
    -1: Datei konnte nicht geöffnet werden
     0: Auf Prozess kann nicht gewartet werden
     1: Ausführendes Programm wurde beendet oder durch Benutzer abgebrochen}

begin
  Result:= -1;
  FillChar(ExecuteInfo, SizeOf(TSHELLEXECUTEINFO), 0);
  With ExecuteInfo do
  begin
    cbSize:= SizeOf(TSHELLEXECUTEINFO);
    lpVerb:= 'open';
    lpFile:= PChar(Filename);
    lpParameters := PChar(Params);
    nShow:= SW_HIDE;
    fMask:= SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
    Wnd:= Application.Handle;     //Hier muss ich wohl ein anderes Handle angeben??
  end;
  if ShellExecuteEx(@ExecuteInfo) and (ExecuteInfo.hInstApp> 32then
  begin
    w:= WAIT_FAILED;
    If ExecuteInfo.hProcess <> 0 then
    Repeat
      w:= WaitForSingleObject(ExecuteInfo.hProcess, 1000);
      Application.ProcessMessages;
    Until (Abbruch= True) or (w= WAIT_OBJECT_0) or
          (w= WAIT_ABANDONED) or (w= WAIT_FAILED);

    if (w<> WAIT_ABANDONED) and (w<> WAIT_FAILED) then Result:= 1
    else Result:= 0;
  end
  else
    Case GetLastError of
      ERROR_FILE_NOT_FOUND,
      ERROR_PATH_NOT_FOUND: Result:= -2;
      ERROR_NO_ASSOCIATION: Result:= -3;
    end;
end;


Statt dem Application.Handle Da muss wohl ein anderes Handle hin? Aber wie leite ich den Text aus diesem Handle dann in ein Memo (oder Stringlist) um?


Danke schon mal,

Frankie


jaenicke - Di 04.03.08 15:51

Ich sollte mir eine Vorlage zur Beantwortung dieser Frage machen, dann muss ich das nicht jedesmal neu tippen, wenn die Frage wieder einmal kommt...

Unter diesem Link findest du eine Funktion dafür, die dir die Ausgabe des gestarteten Programms zurückliefert:
http://www.delphi-library.de/viewtopic.php?p=385387


nagel - Di 04.03.08 15:52

Du kannst beispielsweise Suche in: Delphi-Forum TDOSCOMMAND nutzen oder das hier [http://www.delphipraxis.net/topic42000_console+in+delphiprogramm.html] versuchen.


Frankieboy - Di 04.03.08 16:47

Sorry,

ich hab wirklich im Forum gesucht...
Aber nix gefunden!

Trotzdem VIELEN DANK für die Antwort!

Grüße,

Frank


turboPASCAL - Do 06.03.08 00:39

Schau mal hier, das sollte dir helfen können.
http://www.delphipraxis.net/post417724.html#417724

Mer braucht man nicht. ;)