Помощь - Поиск - Пользователи - Календарь
Полная версия: Запуск программы. Функция Dos2Win()
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Yu_Lo
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(). Как лечить?
mj
На исходниках есть пример запуска приложения и ожидание его завершения, а у тя тут простой перехват консоли идёт...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.