IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Запуск программы. Функция Dos2Win()
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


Procedure TForm1.Dos2Win(CmdLine : string; var Line : string);
const BUFSIZE = 2000;
var SecAttr     : TSecurityAttributes;
   hReadPipe,
   hWritePipe  : THandle;
   StartupInfo : TStartUpInfo;
   ProcessInfo : TProcessInformation;
   Buffer      : Pchar;
   WaitReason,
   BytesRead   : DWord;
begin
 with SecAttr do
 begin
   nlength              := SizeOf(TSecurityAttributes);
   bInheritHandle       := true;
   lpSecurityDescriptor := nil;
 end;
 if CreatePipe (hReadPipe, hWritePipe, @SecAttr, 0) then
 begin
   Buffer  := AllocMem(BUFSIZE + 1);
   FillChar(StartupInfo, Sizeof(StartupInfo), #0);
   StartupInfo.cb          := SizeOf(StartupInfo);
   StartupInfo.hStdOutput  := hWritePipe;
   StartupInfo.hStdInput   := hReadPipe;
   StartupInfo.dwFlags     := STARTF_USESTDHANDLES +
                              STARTF_USESHOWWINDOW;
   StartupInfo.wShowWindow := SW_HIDE;

   if CreateProcess(nil, PChar(CmdLine), @SecAttr, @SecAttr, true,
     NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
   begin
     repeat
       WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);
       Application.ProcessMessages;
     until (WaitReason <> WAIT_TIMEOUT);
     repeat
       BytesRead:=0;
       ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
       Buffer[BytesRead]:= #0;
       OemToAnsi(Buffer,Buffer);
       Line := Line + string(Buffer);
     until (BytesRead < BUFSIZE);
   end;
   FreeMem(Buffer);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(hReadPipe);
   CloseHandle(hWritePipe);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var OutLine : string;
begin
 // ProgramPath - path to 'Prg.exe' program
 // Command     - Командная строка
 //
 ShellExecute(0,'open',PChar('Prg.exe'),PChar(Command),PChar(ProgramPath),SW_HIDE);
 Dos2Win('Prg.exe',OutLine);
 // OutLine - Information Line!
end;



Help!

Почему приведенный код не работает с программами? (В данном случае - 'Prg.exe')
С *.bat файлами все в порядке. При их использовании OutLine содержит перехваченную информацию с консольного приложения(bat). Наоборот, при использовании файлов *.exe функция Dos2Win виснет sad.gif , хотя программа запускается и выполняется отменно! Почему?
Замена SW_HIDE на SW_SHOW не помогла. Мне кажется, что во всем виновата функция ReadFile() из функции Dos2Win(). Как лечить?

Сообщение отредактировано: volvo -


--------------------
*Origin: I live... somewhere in time!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Adminь
****

Группа: Пользователи
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

Репутация: -  5  +


На исходниках есть пример запуска приложения и ожидание его завершения, а у тя тут простой перехват консоли идёт...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.09.2017 9:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"