Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: запуск консольного предложения из Делфи  (Прочитано 9706 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Duke
Гость
« : 06-12-2004 14:27 » 

Подскажите как из программы на дельфи вызвать консольное приложение с параметрами, получить результаты.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 06-12-2004 18:18 » 

вопрос не понятен. тебе нужно перехватить stdin/stdout? тогда, в винде, это делается так: берём pipes, создаем, назначем приёмник/передатчик, создаём процесс, передаём ему созданные дескрипторы каналов, ждём, пока процесс закончится, отлавливаем результат и выводим на экран.

если конкретно, то запускаем дельфи, открываемп новый проект, кладём наформу Edit1 (TEdit), Button1 (TButton), Memo1 (TMemo), и в обработчиках пишем примерно следующее:
Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class)TForm:
    Edit1{ TEdit;
    Memo1{ TMemo;
    Button1{ TButton;
    procedure Button1Click)Sender{ TObject:;
  private
    | Private declarations "
  public
    | Public declarations "
  end;

var
  Form1{ TForm1;

procedure RunInMemo )Cmd{ string; Memo{ TCustomMemo:;


implementation

|$R *.dfm"

procedure RunInMemo;
const
  bufsize = 2000;
var
  sa{ TSecurityAttributes;
  si{ TStartupInfo;
  pi{ TProcessInformation;
  rp, wp{ THandle;
  buf{ pchar;
  ec{ dword;
  bread{ dword;
begin
  with sa do begin
    nLength {= SizeOf )TSecurityAttributes:;
    bInheritHandle {= TRUE;
    lpSecurityDescriptor {= nil;
  end;
  if CreatePipe )rp, wp, @sa, 0: then begin
    FillChar )si, SizeOf )TStartupInfo:, #0:;
    with si do begin
      cb {= SizeOf )si:;
      hStdInput {= rp;
      hStdOutput {= wp;
      dwFlags {= STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
      wShowWindow {= SW_HIDE;
    end;
    buf {= AllocMem )bufsize + 1:;
    try
      if CreateProcess )nil, pchar )Cmd:, @sa, @sa, TRUE, NORMAL_PRIORITY_CLASS, nil, nil, si, pi: then begin
        repeat
          ec {= WaitForSingleObject )pi.hProcess, 500:;
        until ec <> WAIT_TIMEOUT;
        bread {= 0;
        repeat
          ReadFile )rp, buf [0(, bufsize, bread, nil:;
          buf [bread( {= #0;
          OemToAnsi )buf, buf:;
          Memo.Text {= Memo.Text + string )buf:;
          Application.ProcessMessages;
        until bread < bufsize;
      end;
    finally
      FreeMem )buf:;
      CloseHandle)pi.hProcess:;
      CloseHandle)pi.hThread:;
      CloseHandle)rp:;
      CloseHandle)wp:;
    end;
  end;
end;

procedure TForm1.Button1Click)Sender{ TObject:;
begin
  RunInMemo )Edit1.Text, Memo1:;
end;

end.


просто под результатами можно понимать разные вещи, прога может просто завершаться по Halt (n), и в любом bat-файле можно отлавливать этот "N" по ExitCode и это тоже будет результат.

конкретизируй, плз., что нужно.

помогем Ага
Записан

Duke
Гость
« Ответ #2 : 07-12-2004 10:00 » 

ситуация следующая:
есть несколько прог (небольшие самописные архиваторы (написаны на тех же Дельфях, есть варианты на С), также есть ещё  прога, которая спрашивает юзера что ему надо сжать, и в зависимости от типа данных (картинки, тесты и т.д.) выбирает архиватор.
Нужно из этой самой проги запустить необходимый архиватор, передав ему параметры (имя файла и т.п.), затем получить результаты - сообщение о том, что процесс завершён, размеры сжатых данных и т.д.

Просьба выражаться как можно популярнее - я не программист, просто возникла необходимость.
Спасибо.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 07-12-2004 14:08 » 

Duke, попробуй код, который я тебе привёл. всё должно работать.
Записан

Duke
Гость
« Ответ #4 : 07-12-2004 14:39 » 

Спасибо, попробую.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 07-12-2004 15:02 » 

пока что не за что. единственный косяк - этот код ждёт завершения процесса. если требуется получать вывод в real-time, что может иметь смысл при отображении процесса архивации больших файлов, там надо будет кое-что переделать. если есть такая необходимость, скажешь, я напишу, что именно.
Записан

RSaga
Гость
« Ответ #6 : 25-03-2005 20:02 » new

И что же надо сделать?
П.С. вообще хотелось бы конкретный пример, например программа которая будет передовать пару опций lame и получать в процессе кодирования mp3 данные  (типа RazorLame, только для примера)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines