Могу ли я получить доступ к строке, возвращенной из команды Delphi CreateProcess?

StackOverflow https://stackoverflow.com/questions/343476

Вопрос

Я использую функцию Win32 CreateProcess для вызова внешнего исполняемого файла. Исполняемый файл возвращает строку.

Есть ли способ, которым я могу захватить и опросить возвращенную строку после вызова исполняемого файла? В противном случае мне, возможно, придется записать строку в файл в исполняемом файле и прочитать ее в вызывающей программе после завершения вызова. Хотя это кажется неубедительным.

Это было полезно?

Решение

Библиотека кодов джедаев содержит функцию CreateDOSProcessRedirected, которая запускает процесс и обеспечивает его входным и выходным файлом. Вы можете поместить необходимые входные данные (если они есть) во входной файл и прочитать выходные данные процесса (если есть) из выходного файла (после завершения процесса).

Вот как это реализовано в 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;

Другие советы

Предполагая, что вы хотите записать то, что исполняемый файл пишет в стандартный вывод, Вы можете начать это с

yourprog.exe > results.txt

Это запишет вывод в results.txt, который вы затем сможете прочитать и оценить.

Или вы можете попробовать метод, описанный в этой теме : создать канал для вывода из вашего порожденного процесса и чтения из него. Пост № 7 содержит исходный пример того, как использовать соответствующие функции WinApi в C ++, которые должны быть легко переведены на Delphi.

Как исполняемый файл возвращает строку ? Больше всего я знаю, что исполняемый файл может возвращать только число, код выхода.

Вы можете использовать общую память для связи между двумя приложениями.

Вы можете использовать функцию Win32 CreateFileMapping и, возможно, использовать мьютекс для синхронизации вызовов с отображенным в память файлом.

Следующий код создает файл.

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);

следующий код закрывает файл карты

if PMapData <> nil then
  UnMapViewOfFile(PMapData);
if fMapping <> 0 then
  CloseHandle(fMapping);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top