Показать полную графическую версию : Модифицированный SFX модуль 7-Zip'а для установок
CryptoNick
11-02-2017, 12:32
ya158, Просто я считаю, что в дистрибутиве программы должна быть только сама программа и никаких служебных файлов.Это понятно... Ошибок и недоработок модуля уже много собралось... Вот бы вернулся Олег, и подправил... Готов даже финансово про стимулировать....
Вот бы вернулся Олег, и подправил.. »
Всеми частями тела "За"... Может есть какая-нибудь информация о нем?
Victor_Man
11-02-2017, 18:00
Готов даже финансово про стимулировать.... »
Поддерживаю...но что-то его не слышно давно.
Victor_Man
11-02-2017, 18:17
Цитата ya158:
А чей же тогда PID? У двух процессов одинаковый PID? »
Да не, при двух процессах все нормально.
А это я писал для экстремального варианта, когда после первого запуска кликаешь еще 2 раза, например.
Тогда:
PID1 - первый
PID2 - второй
PID3 - третий
К моменту запроса из-за загрузки системы оба процесса могут получить именно так - PID3 последний (для одного он свой, для другого - чужой). Далее они оба пытаются убить последний, один убивает быстрее, второй получает код завершения TaskKill 128 (нет такого процесса). И далее может быть коллизия с вылетом из PreExtract в скрипт 7xSFX и повторным запуском разархивации и т.д.
Но это экстрим, как я уже писал. И словил его я именно при большой загрузке системы (Auslogic Defrag) и паре-тройке "повторных" запусков.
Victor_Man
11-02-2017, 23:21
Со сторонними утилитами, выложенными в теме ранее, не хотите попробовать продолжить эксперименты? »
Кстати, а какой смысл использовать сторонние? Если уж использовать внешние программы, то родные MS.
Как там в Вечерах..."Тому не надо черта искать, у кого черт за спиной" :)
Я проверял - на W7x86/x64 и Win10x64 работают TaskList.exe и TaskKill.exe от XPSP3.
На WinPe не проверял - ну, попробуйте сами.
Файлы от английской 5.1.2600.5512 вот:
https://www.upload.ee/files/6663774/XP_SP3_EN.rar.html
В вызовах дописываете путь (нужно передавать в .cmd %%T) и дописываете .exe к имени задачи.
И все работает.
В принципе, тогда можно и /FI (фильтры) использовать на английском ('Tasklist /FO CSV /FI "IMAGENAME eq %XXXXXX%" /NH ').
Victor_Man,
Все равно немного недопонял с процессами.
Может это как раз из-за того, что на сильно загруженной системе разные копии инсталлятора пытаются запустить дополнительный файл z1_KillTask.cmd, причем, насколько я понимаю один и тот же... Попробуйте протестировать предложенный мною вариант без доп файла.
Victor_Man
12-02-2017, 16:12
ya158, sov44
На усиленное тестирование не хватило времени и терпения...
Попробовал оба варианта и вот небольшое дополнение - нужно первой командой удалить SfxVarApiPath:
cmd /c cd /d %TEMP%&rd /s /q \"%SfxVarApiPath%\"&...А то остаются SfxVarApiPath в %TEMP%.
Ну а так в принципе оба решения вполне рабочие...только проблема одна все-таки обнаружилась, пока глубоко не копал:
Если далее программу вызывать с waitall:, то получаю такое сообщение:
DiskDefrag_Std_RU.exe: ошибка
------------------------------------
Произошла ошибка при выполнении DiskDefrag.exe
Неверная функция.
==================================
Никакого отношения к загрузке системы не имеет, т.к. и в спокойном состоянии то же самое.
Обидно...так красиво все получилось, может, посмотрите, как с другими программами?
Я просто уже не успеваю, может, это и c DiskDefrag только.
Хотя...тут проблема общая, наверное, т.к. по waitall: запускается второй процесс, вот он и киллится.
Но у меня почему-то такого не происходит, я тоже боялся раньше, когда делал вариант с .cmd, но при проверке проблем не обнаружилось и я дальше не копал.
В файле анализ такой (zz_M%=%%M):
For /F "Tokens=1,2 Delims=," %%I In ('Tasklist /FO CSV /NH ') Do (If %%I=="%zz_M%" (Set PID=%%~J&&Set /a N+=1))
If %N% LEQ 1 goto NEXT - это нормальный выход, иначе TaskKill
Вроде по логике то же самое.
DiskDefrag_Std_RU.exe: ошибка »
Может дело в DiskDefrag_Std_RU.exe? Попробуйте запустить другую программу, например, Блокнот.
Завтра попробую с каким-нибудь своим инсталлятором...
Victor_Man
12-02-2017, 17:37
Я вечером попозже тоже попробую. Но непохоже на DiskDefrag. Он стоит себе спокойненько, кликаю на сборке - вылетает первая копия.
Выхода из ExecuteOnLoad и повторной загрузки по RunProgram точно не было, там у меня Pause стояло для отладки.
Да, еще одно замечание:
TaskList без ключей выводит в формате колонок с разделителями=пробел.
Могут быть проблемы, если кто сделает сборку с пробелом в имени.
Victor_Man
12-02-2017, 21:57
Да, я писал насчет TaskList/TaskKill - не работают он в WinNpe, не хватает какой-то оснастки.
Можно только PsList и PsKill попробовать из PsTools.
Victor_Man
13-02-2017, 23:51
ya158, насчет waitall - все правильно, так и должно быть, т.к. запускается второй процесс, нужно писать cmd /v:on /C IF !N! GTR 2Ну, или, чтобы не менять стоку, написать SetEnvironment="NProc=2"
......cmd /v:on /C IF !N! GTR %NProc%Или вот все вместе для waitall, с учетом того, что я писал ранее:
SetEnvironment="NProc=2"
ExecuteOnLoad="hidcon:cmd /c cd /d %TEMP%&rd /S /Q \"%SfxVarApiPath%\"&FOR /F \"Tokens=1,2 Delims=,\" %I IN ('\"Tasklist /FO CSV /NH|FINDSTR /BILC:\\\"%%M\\\"\"') DO SET /A N+=1& cmd /v/c IF !N! GTR %NProc% TASKKILL /F /T /PID %J"
RunProgram="waitall:.\DiskDefrag.exe"
Victor_Man,
Добавил в свой работающий инсталлятор строку (правда она в самом конце - не знаю влияет ли):
RunProgram="hidcon:waitall:cmd /с echo."
Ошибок не возникло ни при одиночном ни при двойном запуске инсталлятора. Проверял на 7 на чистой виртуалке. Проверка стоит:
IF !N! GTR 1
Но ещё потом погоняю...
Hi Oleg_Sch!
Your website seems to be down. Would you continue to develop 7zSFX Modules?
Thanks!
Victor_Man
24-02-2017, 19:01
Обнаружил странную вещь...
Есть простейший SFX на R-DriveImage (я все лишнее выкинул):
https://www.upload.ee/files/6714356/__Build_New.rar.html (https://www.upload.ee/files/6714356/__Build_New.rar.htm)
Внутри:
- билдер (запускаем z_Pack_EXE.CMD, получаем .exe)
- два варианта 7zsd_LZMA.sfx (v160.3807 v161.3874)
- образ маленькой флэшки с одним файлом для монтирования
Если в билдер записать 7zsd_LZMA.sfx v161.3873 (уже там), получить .exe, запустить, выбрать монтирование - то оно происходит очень долго
Если в билдер записать 7zsd_LZMA.sfx v160.3807, получить .exe, запустить, выбрать монтирование - оно происходит мгновенно
Ну, и все предыдущие версии до v160.3807 также работают быстро, все после v161.3873 - также медленно.
Разархивированные файлы, окружение, манифесты...все одинаково!
Дело не в данном примере...мало ли где это может выскочить.
Может, кто помнит, что там менялось при переходе с v1.60 на v1.61?
==============================================
Исходники я нашел на v160.3861 v160.3873 - проблема появилась между этими версиями.
Вот это поменялось: * Окна некоторых дочерних процессов отображались на заднем плане - проблема где-то здесь.
Но разбираться большого смысла нет, т.к. совсем не обязательно использовать ExecuteOnLoad.
Вариантов много, например, уже опробованные на R-DriveImage:
- распаковывать без InstallPath, потом все то же самое, только в RunProgram (с TaskKill).
- распаковывать с InstallPath и OverwriteMode=1 и делать флаг в виде пустого файла. Это вообще без TaskKill.
Тогда и старые версии 7zSFX можно использовать.
=============================================
Нашлось решение и для новой версии 7xSFX - запуск через start, чтобы отвязаться от "дурной" наследственности:
RunProgram="hidcon:waitall:cmd.exe /c start /wait /B /I R-DriveImage.exe"Но...после многократного запуска проблемы опять начинаются.
Так что это проблемы больше самого R-DriveImage, как-то он хитро работает с драйверами.
Вопрос закрыт.
ConstantineNoise
27-02-2017, 23:09
Доброго всем!
У кого то остался линк на Loader.7z.000_s2_090925_11-11.7z ? Для создания многотомных архивов exe
Поделитесь пожалуйста!
Спасибо заранее.
jameszero
28-02-2017, 10:42
Универсальный загрузчик для многотомных 7z SFX архивов - http://forum.oszone.net/post-970472-604.html
ConstantineNoise, Последние версии модуля (1.6 develop (сборка 3574) 11.05.15) поддерживают многотомные SFX и изобретать велосипед более не требуется »
ConstantineNoise
28-02-2017, 17:46
Отлично, спасибо!
А если создавать не многотомный архив, а обычный, но размером 5 ГБ, его модуль установки запустить сможет? x86 x64?
soldatovaua
02-03-2017, 09:03
Поделитесь. пожалуйста, своими мыслями. Есть программа BIRTHDAY! millennium (файл прикладываю). http://rgho.st/6rL4VP9m2 Упакована с помощью WinZip Self Extractor.
Задумал немного изменить файлы в инсталляторе. Файл содержит программу EXE, сам файл install.exe и другие файлы. Разахивирую все в отдельную папку. заменяю файлы. пытаюсь заново создать SFX с помощью модифцированного 7zipSFX, чтобы после извлечения запускал install.exe, получается следующая ситуация.
Весь архив (и WinZip Self Extractor, и 7zipSFX) извлекается во временную папку, запускается install.exe. Только при создании с помощью 7zipSFX он находит во временной папке birthmil.exe и вместо установки запускает удаление. В оригинале через WinZip Self Extractor все также, только запускает установку.
Не могу понять, что и как сделать? Нет нужных значений в конфиге или что-то другое? Конфиг обычный: кроме BeginPromt и др. текста - только RunProgram="install.exe".
CryptoNick
03-03-2017, 08:41
soldatovaua, Вам уже подсказали на другом ресурсе...
Нужно запускать Install.exe с параметром /setup
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.