![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess и “DOS архиватор”.
xGrey © (2003-01-17 11:51:00)Уважаемые мастера! Помогите советом.
Создаю процесс ф-цией CreateProcess в котором запускается “DOS архиватор”. Процесс автоматически завершается после закрытия окна архиватора.
Жду окончание работы процесса ф-цией WaitforSingleObject.
Проблема в следующем: в Win9x для архиватора должен существовать *.pif файл, в котором хранится информация о том, что нужно "закрывать окно после завершения работы". Иначе процесс не завершается и приложение вешается.
Можно ли избавиться от *.pif файла, передав входным параметрам ф-ции CreateProcess соответствующие данные?
xGrey (2003-01-17 17:52:00) [1]То AKu:
Спасибо, посмотрю.
AKu (2003-01-17 16:28:00) [2]Я тут подумал, наверное лучше всего перенаправить вывод архиватора в другое место, заменив hStdOut в StartupInfo, тогда он не будет использовать окно консоли. Пример смотри в программе TDosMemo на этом сайте.
А по поводу моего раннего способа могу сказать, что я над ним раньше не раздумывал, мне срочно нужно было перепаковать несколько сотен файлов и я не заботился об изящности способа.
AKu (2003-01-17 15:16:00) [3]Кстати, может быть попробовать запускать не сам архиватор, а BAT-файл вида:
arj %1
exit
xGrey (2003-01-17 14:13:00) [4]to AKu
Вариант, конечно :)
Правда, теряется универсальность:
-для каждого исп. архиватора нужно хранить константы с соотв. надписями;
-надпись будет зависеть от локализации OS и от типа OS (9x / NT), возможно и от локальных настроек пользователя.
+ доп. расход ресурсов на сканирование окна каждые 100 миллисекунд.
IMHO, с *.pif все же лучше....
AKu (2003-01-17 13:35:00) [5]У меня пару дней назад возникла такая же проблема, которую нужно было срчно решить. Я применил очень тупой метод: запустил архиватор (у меня - HA.exe) CreateProcess c параметром SW_ShowMinimized, а потом
var p:TProcessInfo;
...
while WaitForSingleObject(p.hProcess,100)=WAIT_OBJECT_0 do
if FindWindow(nil,"(Сеанс завершен) - HA")<>0 then TerminateProcess(p.hProcess);
Для моих целей такого кода оказалось вполне достаточно, но интересно узнать, как же это можно сделать по-человечески.
xGrey (2003-01-17 13:03:00) [6]to DOOMin
ARJ 2.71
IMHO, эта проблема будет с любым "поддосовым" архиватором в Win9x.
Исп. чего-то стороннего не хочется, т. к. уже написан и работает соотв. класс.
Тем более что передовая в pCommandLine (CreateProcess) путь к архиватору + ключи, можно работать пр. с любым архиватором.
Меня смущает только одно: пользователь, сняв галку в св-вах *.pif "закрывать окно после завершения работы", может подвесить мое приложение...
DOOMin (2003-01-17 12:42:00) [7]А что за архиватор? Не легче ли найти компоненты, которые будут паковать в этот формат без запуска стороннего приложения? Практически для всех распространенных архиваторов таковые имеются www.torry.net