Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как получить результат работы консольной программы

- Чем отличается программист от сперматозоида?
- У сперматозоида есть один шанс из 50000000 стать человеком.

Hужно использовать пайпы (CreatePipe), и работать с ними как с обычным файлом.


const
  H_IN_READ = 1;
  H_IN_WRITE = 2;
  H_OUT_READ = 3;
  H_OUT_WRITE = 4;
  H_ERR_READ = 5;
  H_ERR_WRITE = 6;

type
  TPipeHandles = array [1..6] of THandle;
var
  hPipes: TPipeHandles;
  ProcessInfo: TProcessInformation;

(************CREATE HIDDEN CONSOLE PROCESS************)
function CreateHiddenConsoleProcess(szChildName: string;
         ProcPriority: DWORD; ThreadPriority: integer): Boolean;
label
  error;
var
  fCreated: Boolean;
  si: TStartupInfo;
  sa: TSecurityAttributes;
begin
  // Initialize handles
  hPipes[ H_IN_READ ] := INVALID_HANDLE_VALUE;
  hPipes[ H_IN_WRITE ] := INVALID_HANDLE_VALUE;
  hPipes[ H_OUT_READ ] := INVALID_HANDLE_VALUE;
  hPipes[ H_OUT_WRITE ] := INVALID_HANDLE_VALUE;
  hPipes[ H_ERR_READ ] := INVALID_HANDLE_VALUE;
  hPipes[ H_ERR_WRITE ] := INVALID_HANDLE_VALUE;
  ProcessInfo.hProcess := INVALID_HANDLE_VALUE;
  ProcessInfo.hThread := INVALID_HANDLE_VALUE;
  // Create pipes
  // initialize security attributes for handle inheritance (for WinNT)
  sa.nLength := sizeof(sa);
  sa.bInheritHandle := TRUE;
  sa.lpSecurityDescriptor := nil;
  // create STDIN pipe
  if not CreatePipe( hPipes[ H_IN_READ ], hPipes[ H_IN_WRITE ], @sa, 0 ) then
    goto error;
  // create STDOUT pipe
  if not CreatePipe( hPipes[ H_OUT_READ ], hPipes[ H_OUT_WRITE ], @sa, 0 ) then
    goto error;
  // create STDERR pipe
  if not CreatePipe( hPipes[ H_ERR_READ ], hPipes[ H_ERR_WRITE ], @sa, 0 ) then
    goto error;
  // process startup information
  ZeroMemory(Pointer(@si), sizeof(si));
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  // assign "other" sides of pipes
  si.hStdInput := hPipes[ H_IN_READ ];
  si.hStdOutput := hPipes[ H_OUT_WRITE ];
  si.hStdError := hPipes[ H_ERR_WRITE ];
  // Create a child process
  try
    fCreated := CreateProcess( nil, PChar(szChildName), nil, nil, True,
    ProcPriority, // CREATE_SUSPENDED,
    nil, nil, si, ProcessInfo );
  except
    fCreated := False;
  end;

  if not fCreated then
    goto error;

  Result := True;
  CloseHandle(hPipes[ H_OUT_WRITE ]);
  CloseHandle(hPipes[ H_ERR_WRITE ]);
  // ResumeThread( pi.hThread );
  SetThreadPriority(ProcessInfo.hThread, ThreadPriority);
  CloseHandle( ProcessInfo.hThread );
  Exit;
  //-----------------------------------------------------
  error:
    ClosePipes( hPipes );
    CloseHandle( ProcessInfo.hProcess );
    CloseHandle( ProcessInfo.hThread );
    ProcessInfo.hProcess := INVALID_HANDLE_VALUE;
    ProcessInfo.hThread := INVALID_HANDLE_VALUE;
    Result := False;
end;

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay