Kann ich die Zeichenfolge Zugriff von einem Delphi Create Befehl zurückgegeben?
-
19-08-2019 - |
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.
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).
lesenDas 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
startenyourprog.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);