Модераторы: 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   Вверх
bems
Дата 11.3.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В процессе программирования нужны переменные, какой кошмар. 
А то что он у тебя не запустился, так тут ключевая фраза "у тебя"


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


Эксперт
***


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

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



Цитата(Данкинг @  11.3.2011,  16:59 Найти цитируемый пост)
Что хуже, если у меня пример проще некуда? Кроме Comobj никаких библиотек не требует, тучи непонятных простому смертному параметров, как я уже говорил, тоже не просит, занимает 3 строчки кода и работает стопроцентно верно? 


Я на тебя посмотрю, когда WSH будет не установлен в системе, или ты будешь вызывать этот код в других условиях, когда добрая Delphi не вызовет за тебя OleInitialize. Отдельный привет именам с пробелами. Не говоря уже про то, что Run - аналог ShellExecute. Т.е. если файловой ассоциации нет, то фиг ты запустишь.

Это сообщение отредактировал(а) CodeMonkey - 11.3.2011, 23:31


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


Yersinia pestis
****


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

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



Ещё в качестве флуда. smile Вечером на работу к нас зашёл программер, который уволился недели 3 назад. Выпили коньячку, и сказал я ему о том, что на Винграде спорим о том, как %сабж%. И вот что он ответил: "Самое простое, что я видел - это..." Далее предоставляю право догадаться, что именно он ответил. smile  smile 
Цитата(bems @  11.3.2011,  21:42 Найти цитируемый пост)
В процессе программирования нужны переменные, какой кошмар. 

Ага, нужны. Только тут дело в том, что объявлять их требуется для CreateProcess, но вот далее оные нигде не используются.


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


Эксперт
***


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

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



Несомненно, самое простое что я видел для закручивания шурупов - это молоток.

Продолжай в том же духе - так придём к светлому будущему, товарищ!


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


Yersinia pestis
****


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

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



Цитата(CodeMonkey @  11.3.2011,  23:30 Найти цитируемый пост)
когда добрая Delphi не вызовет за тебя OleInitialize.

На фоксе этот код тоже отлично работает.
Цитата(CodeMonkey @  11.3.2011,  23:30 Найти цитируемый пост)
Не говоря уже про то, что Run - аналог ShellExecute. Т.е. если файловой ассоциации нет, то фиг ты запустишь.

Если нет файловой ассоциации с .exe - значит, пора винду переустанавливать или же откатывать на момент установки. smile
Цитата(CodeMonkey @  11.3.2011,  23:36 Найти цитируемый пост)
Несомненно, самое простое что я видел для закручивания шурупов - это молоток.

Молотком шуруп куда сложнее забивать, нежели запустить программу с помощью моего кода. smile Плюс, повторюсь снова и снова, никаких лишних переменных.

Добавлено @ 00:02
Цитата(CodeMonkey @  11.3.2011,  23:30 Найти цитируемый пост)
Отдельный привет именам с пробелами. 

Тебе взаимный привет от двойных кавычек, обрамляющих путь к программе. smile 

Это сообщение отредактировал(а) Данкинг - 12.3.2011, 00:03


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


Эксперт
***


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

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



Цитата(Данкинг @  11.3.2011,  23:59 Найти цитируемый пост)
Цитата(CodeMonkey @  11.3.2011,  23:30 Найти цитируемый пост)
Не говоря уже про то, что Run - аналог ShellExecute. Т.е. если файловой ассоциации нет, то фиг ты запустишь.

Если нет файловой ассоциации с .exe - значит, пора винду переустанавливать или же откатывать на момент установки. 


Вы же сами упоминали про топик стартера. А где в его вопросе точное указание, что ему нужно просто запустить произвольный EXE-шник?
Он же пишет свою программу не "для просто так"? И это явно не вариант shell'а, иначе зачем нужно дожидаться завершения работы запущенного приложения. Для меня из текста вопроса ясно, что автор в своей программе готовит какие-то данные для последующей обработки другой программой. Он должен дождаться завершения этой обработки, после чего должен продолжить свою работу уже имея готовый результат другой программы. А в этом случае ваш вариант плохо подходит.
Точнее, совсем не подходит!

Это сообщение отредактировал(а) northener - 12.3.2011, 04:51


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


Эксперт
****


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

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



Цитата(Данкинг @  11.3.2011,  23:34 Найти цитируемый пост)
Только тут дело в том, что объявлять их требуется для CreateProcess, но вот далее оные нигде не используются. 
Используется для передачи хендла процесса в Wait-функцию. И не надо привлекать мифических соратников на свою сторону, тебе же три человека говорят прямо здесь что это неправильно. 
И перестань смайлофажить, ты не в песочнице.



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


Yersinia pestis
****


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

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



Цитата(bems @  12.3.2011,  09:24 Найти цитируемый пост)
И не надо привлекать мифических соратников на свою сторону

Почему мифических? Почему привлекать? Я спросил, как бы сделал он сам, ничего не говоря ни о ole, ни о createprocess.
Цитата(bems @  12.3.2011,  09:24 Найти цитируемый пост)
тебе же три человека говорят прямо здесь что это неправильно. 

Да-да, только кроме меня и Акеллы кода никто не написал. Все только говорят, что это неправильно, но правильного кода никто не приводит. Мне одному кажется, что что-то не так?
Цитата(bems @  12.3.2011,  09:24 Найти цитируемый пост)
И перестань смайлофажить, ты не в песочнице.

Не знаю, что такое "смайлофажить", видимо, что-то со смайликами связано. А разве смайлики можно употреблять только в песочнице? smile 
Цитата(northener @  12.3.2011,  02:01 Найти цитируемый пост)
А где в его вопросе точное указание, что ему нужно просто запустить произвольный EXE-шник?

Речь идёт о запуске утилиты. Ну, утилита может быть и .com, это сути не меняет. smile 
Цитата(northener @  12.3.2011,  02:01 Найти цитируемый пост)
после чего должен продолжить свою работу уже имея готовый результат другой программы. А в этом случае ваш вариант плохо подходит.

Готовы результат получить, и что? Вот даже не знал - не гадал, что мой рабочий вариант, оказывается, плохо подходит. Теперь буду в курсе.


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


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


Эксперт
****


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

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



Цитата(Данкинг @  12.3.2011,  14:35 Найти цитируемый пост)
Почему мифических? 
потому что это миф.
Цитата(Данкинг @  12.3.2011,  14:35 Найти цитируемый пост)
Да-да, только кроме меня и Акеллы кода никто не написал. Все только говорят, что это неправильно, но правильного кода никто не приводит. Мне одному кажется, что что-то не так?
Походу да, тебе одному. Акелла показал в принципе правильный код, только с парочкой флагов, которые могут быть и не нужны, и нечего тут еще показывать.

Тема скатилась, закрываю.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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