Frage

Ich bin mit der Win32 CreateProcess Funktion einen Anruf an eine externe ausführbare Datei auszuführen. Die ausführbare Datei gibt einen String zurück.

Gibt es eine Möglichkeit, ich erfassen und abfragen, die zurückgegebene Zeichenfolge nach dem ausführbaren Aufruf? Gelingt das nicht, könnte ich habe die Zeichenfolge in eine Datei in der ausführbaren Datei zu schreiben und lesen, dass im rufenden Programm, nachdem der Anruf beendet ist. Das scheint zwar lahm.

War es hilfreich?

Lösung

Jedi Code Library enthält Funktion CreateDOSProcessRedirected, die ein Prozess läuft und bietet es mit Eingabe- und Ausgabedatei. Sie können erforderliche Eingabe (falls vorhanden) in die Eingabedatei setzen und Prozessausgang (falls vorhanden) aus der Ausgabedatei (nachdem der Prozess abgeschlossen ist).

lesen

Das ist, wie dies umgesetzt wird in der JCL :

function CreateDOSProcessRedirected(const CommandLine, InputFile, OutputFile: string): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecAtrrs: TSecurityAttributes;
  hInputFile, hOutputFile: THandle;
begin
  Result := False;
  hInputFile := CreateFile(PChar(InputFile), GENERIC_READ, FILE_SHARE_READ,
    CreateInheritable(SecAtrrs), OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, 0);
  if hInputFile <> INVALID_HANDLE_VALUE then
  begin
    hOutputFile := CreateFile(PChar(OutPutFile), GENERIC_READ or GENERIC_WRITE,
      FILE_SHARE_READ, CreateInheritable(SecAtrrs), CREATE_ALWAYS,
      FILE_ATTRIBUTE_TEMPORARY, 0);
    if hOutputFile <> INVALID_HANDLE_VALUE then
    begin
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      StartupInfo.cb := SizeOf(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      StartupInfo.wShowWindow := SW_HIDE;
      StartupInfo.hStdOutput := hOutputFile;
      StartupInfo.hStdInput := hInputFile;
      Result := CreateProcess(nil, PChar(CommandLine), nil, nil, True,
        CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo,
        ProcessInfo);
      if Result then
      begin
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
      end;
      CloseHandle(hOutputFile);
    end;
    CloseHandle(hInputFile);
  end;
end;

Andere Tipps

Unter der Annahme, dass Sie erfassen möchten, was die exe auf die Standardausgabe schreibt, Sie können es mit

starten
yourprog.exe > results.txt

Das wird die Ausgabe schreiben results.txt, die Sie dann lesen und bewerten.

Alternativ können Sie versuchen, das Verfahren in erklärt dieses Thema : ein Rohr erstellen für die Ausgabe von Ihrem erzeugten Prozess und daraus lesen. Post Nummer 7 hat eine Quelle Beispiel dafür, wie die relevanten WinApi Funktionen in C ++ verwenden, das sollte einfach in Delphi übersetzen.

Wie funktioniert die ausführbare Datei zurückgeben eine Zeichenfolge ? Die meisten, die ich kenne eine ausführbare Datei zurückgeben kann, ist nur eine Nummer, den Code zu beenden.

Sie könnten gemeinsam genutzten Speicher verwenden, um zwischen den beiden Anwendungen zu kommunizieren.

Sie können die Win32-Funktion Create, verwenden und vielleicht einen Mutex verwenden, um Anrufe an die Memory-Mapped-Datei zu synchronisieren.

Der folgende Code erstellt die Datei.

var
  fMapping : THandle;
  pMapData : Pointer;

fMapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
             0, MAPFILESIZE, pchar('MAP NAME GOES HERE'));

PMapData := MapViewOfFile(fMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);

Der folgende Code schließt das mapfile

if PMapData <> nil then
  UnMapViewOfFile(PMapData);
if fMapping <> 0 then
  CloseHandle(fMapping);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top