Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Запуск внешнего приложения, и ожидания его завершения 
:(
    Опции темы
MrDmitry
Дата 11.3.2011, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Пишу не большую программку, программка в ходе своей работы, должна запустить внешнею утилиту(hldsupdatetool), дождаться её завершения и начать выполнять другие действия. То есть нужно чтоб код идущий после запуска внешнего приложения не выполнялся пока не будет завершено это приложение. В интернете полно всяких готовых решений, но в них куча ошибок, а те которые удалось исправить, не работают как нужно


Это сообщение отредактировал(а) MrDmitry - 11.3.2011, 02:01
PM MAIL   Вверх
northener
Дата 11.3.2011, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Вообще-то CreateProcess вполне достаточна для решения сабжа. И во всемирной помойке достаточно примеров её использования. Что именно не получается?
Ну и "в них куча ошибок". Не верю. Это не в них куча ошибок, это ты используешь их неправильно. Ибо не понимаешь их. 


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Данкинг
Дата 11.3.2011, 02:54 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Код

uses comobj;
...
procedure TForm1.Button1Click(Sender: TObject);
var fo:variant;
begin
 fo:=createoleobject('WScript.Shell');
 fo.run('proga.exe',1,true);
 fo:=unassigned;
end;


Добавлено через 1 минуту и 13 секунд
Цитата(northener @  11.3.2011,  02:45 Найти цитируемый пост)
Вообще-то CreateProcess вполне достаточна для решения сабжа. 

Да ладно. Сам пробовал все эти CreateProcess и прочие WinExec - ни разу не получилось.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
northener
Дата 11.3.2011, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Данкинг @  11.3.2011,  02:54 Найти цитируемый пост)
Да ладно. Сам пробовал все эти CreateProcess и прочие WinExec - ни разу не получилось.

Хм. Вот от вас не ожидал такого ответа.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Molodec
Дата 11.3.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 249
Регистрация: 20.12.2010
Где: Украина

Репутация: нет
Всего: 1



В библиотеке JVCL находил компонент для запуска приложения. Может в нем есть и callback функция, которая выполняется при завершении работы приложения. Может здесь стоит "покапать"...
Удачи! 
PM MAIL   Вверх
Akella
Дата 11.3.2011, 09:57 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



уже не раз на форуме давал этот код:

Код

function TfmMain.ExecAndWait(const FileName, Params: ShortString; ArcDir:string;
                               const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
begin
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ArcDir),StartInfo,ProcInfo);
  { Ожидаем завершения приложения }
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;


Используем так, на примере с распаковкой/упаковкой файлов с пом. программы winrar:
Код

//распаковываем все архивы в указаном каталоге и подкаталогах

Procedure TfmUpdateInfo.ExtractArchives(Dir: String);
Var
 SearchRec:TSearchRec;
begin
 try

   if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);

   if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
     repeat
       if (SearchRec.name='.') or (SearchRec.name='..') then continue;
       if ((SearchRec.Attr and faDirectory)<>0) then
         ExtractArchives(Dir+SearchRec.name) //we found Directory: "Dir+SearchRec.name"
       else
        begin
          if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.RAR' then
          begin

              //распаковываем и ожидаем окончания распаковки
              fmMain.ExecAndWait(<путь к winrar>, 'e -ep -y ' + SearchRec.name, dir, 0);

              //удаляем распакованный архив (хотя можно указать ключ и winrar сам может удалять архив)
              DeleteFile(dir + SearchRec.name);

          end;//if ExtractFileExt(SearchRec.name)='.rar' then
        end;//else
     until FindNext(SearchRec)<>0;

 finally
   FindClose(SearchRec);
 end;
end;


этот код проверен во всех виндах, начиная с 98, на 95 не проверялось
PM MAIL   Вверх
Данкинг
Дата 11.3.2011, 10:29 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(northener @  11.3.2011,  06:48 Найти цитируемый пост)
Хм. Вот от вас не ожидал такого ответа. 

Так я же не виноват, что не получилось. smile А вот WScript отлично работает, причём не только из Дельфи.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
bems
Дата 11.3.2011, 14:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Данкинг @  11.3.2011,  10:29 Найти цитируемый пост)
Так я же не виноват, что не получилось
Боюсь виноват именно ты. Потому что CreateProcess работает как надо.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 11.3.2011, 14:20 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(bems @  11.3.2011,  14:16 Найти цитируемый пост)
Боюсь виноват именно ты.

Конечно, именно я, кто же ещё. smile Только интересно, почему мне минус поставили за рабочий и, главное, простой и понятный код? smile В котором нет тучи ненужных параметров, как в CreateProcess, от которых толку всё равно никакого, потому что, как я уже говорил, этот CreateProcess так как надо всё равно не работает. smile 



Это сообщение отредактировал(а) Данкинг - 11.3.2011, 14:21


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
CodeMonkey
Дата 11.3.2011, 14:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Потому что ты не сумел завернуть шуруп отвёрткой и забил его молотком. Даже хуже.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Данкинг
Дата 11.3.2011, 15:59 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(CodeMonkey @  11.3.2011,  14:26 Найти цитируемый пост)
Потому что ты не сумел завернуть шуруп отвёрткой и забил его молотком. Даже хуже.

Что хуже, если у меня пример проще некуда? Кроме Comobj никаких библиотек не требует, тучи непонятных простому смертному параметров, как я уже говорил, тоже не просит, занимает 3 строчки кода и работает стопроцентно верно?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
bems
Дата 11.3.2011, 16:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Во-первых совершенно не обязательно использовать ole для такой простой вещи, как запуск процесса. Во-вторых в CreateProcess все параметры понятны. Если они непонятны лично тебе, это не повод обобщать.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 11.3.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(bems @  11.3.2011,  16:36 Найти цитируемый пост)
Во-вторых в CreateProcess все параметры понятны.

Т.е. мой код менее понятен, чем значение параметров в CreateProcess? 

Это сообщение отредактировал(а) Данкинг - 11.3.2011, 17:34


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
bems
Дата 11.3.2011, 18:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Твой код вполне понятен, но это гoвнoкод. Не нужно создавать ком-объект сервера сценариев чтобы запустить процесс. Нужно просто взять и запустить.

Это сообщение отредактировал(а) bems - 11.3.2011, 18:07


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 11.3.2011, 18:48 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



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

Это сообщение отредактировал(а) Данкинг - 11.3.2011, 18:49


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0955 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.