Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков программирования и крэкерства 5.0
(актуальность: январь 2017)
Свежие инструменты, новые видеоуроки!

  • 300+ видеоуроков
  • 800 инструментов
  • 80 свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Как получить результат работы консольной программы

- Чем отличается программист от сперматозоида?
- У сперматозоида есть один шанс из 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;
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS