Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » [архив] Скрипты Inno Setup. Помощь и советы [часть 2]

Закрытая тема
Настройки темы
[архив] Скрипты Inno Setup. Помощь и советы [часть 2]

Ветеран


Сообщения: 1133
Благодарности: 581


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: jameszero
Дата: 08-11-2010
Описание: тема закрыта
Лимит страниц.
Тема закрыта.
Продолжение по ссылке Скрипты Inno Setup. Помощь и советы [часть 3]




Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;
    Предыдущая версия: 5.3.0 [07.04.2009] - Скачать (зеркало) | Русификатор (зеркало);

  • Inno Script Generator - ещё один редактор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать;

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы. Официальный сайт - недоступен.
    Последняя версия: 2.0.8 [12.11.2006] - Страница с зеркалами;

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • InnoSetup Script Joiner - Программа для объединения нескольких скриптов InnoSetup в один;

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.3 [11.09.2009] - Скачать;


Ссылка на архив предыдущей темы (также можно скачать из вложения)

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 22:06, 23-08-2009

 

Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


R.i.m.s.k.y. - я то там просмотрел и эту исску видел, но это не то или не пойму как её привинтить к моему окну. Эти чекбоскы в окне компонентов пишутся. А у меня все чеки в коде пишуться...
Код: Выделить весь код
var
*****
  GreathCheck  : TCheckBox;
  SearchCheck   : TCheckBox;
  HomeCheck     : TCheckBox;
******

Последний раз редактировалось Cranz86, 21-01-2010 в 16:58.


Отправлено: 16:46, 21-01-2010 | #891



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Cranz86
тогда да, файлик не в тему, как чекбоксы в коде делать я не знаю и уже вряд ли помогу.

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 17:21, 21-01-2010 | #892


Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата South:
не очень понятно где это можно применить на практике, если только рассматривать этот вопрос как чисто академический »
При запуске распаковки архивов.
Цитата South:
если вызвать ExecAndWait, то вызвавшая процедура/функция не завершится пока не завершится запущенное приложение.
а если после этого должны выполнится еще какие-то действия? »
Совершенно верно.
Видимо вы слабо знакомы с Inno Setup. Попробуйте запустить любую программу через Exec или ShellExec с параметром ожидания ewWaitUntilTerminated или запустить через [Run] и вы не сможите передвинуть окно инсталлятора.
Цитата South:
сдается мне, что _ProcIsRunning вообще не в кассу, постоянно шмонать список процессов далеко не лучшее решение. »
Понятно, вы знакомы с программированием...
Самый простой вариант, это открыть файл через OpenProcess, если Handle > 0, то процесс работает...
Ну вообще-то, вы наверно заметили, что я сначала сверяю ID процесса, а затем его имя, т.е. чтоб определить, что это именно тот файл.
Не знаю, знаете вы или нет, но ID процесса в системе не уникален. После завершения этого процесса, его ID освобождается и при запуске другого процесса ему может быть присвоен системой точно такой же ID.
Так что проверка просто по ID, я счёл не совсем правильным и точным.
Ну а более простой способ узнать имя процесса через его ID, мне к сожалению не известен. Если вам известен более простой способ, то поделитесь, так сказать для само развития.

Цитата South:
вообще для этих целей существует WaitForSingleObject »
Не согласен, инсталлятор, так же будет мёртвым, т.е. переместить вы его не сможете.

Цитата South:
данные о запущенных процессах я бы заносил в массив »
и что дальше? Процесс закрылся, а с таким же ID, работает уже другой...

Цитата South:
по уму процедуру ожидания надо делать в отдельном потоке. в инно с этим проблемы, поэтому я бы запустил таймер (не очень хорошо, но на безрыбье ...), »
Совершенно с вами согласен, но стандартный Inno не поддерживает, не только многопоточность, он также не знает, что такое таймер (этот недостаток исправлен в версии от Restools). Если конечно не использовать дополнительных библиотек, а именно эту цель я и приследывал при написании данного скрипта, чтоб можно было использовать его без ничего.

Цитата South:
и была бы отдельная процедура прибития процессов при выходе из инсталла: прибили таймер и опять же пробежались по массиву и всем процессам TerminateProcess »
и прибили другой процесс...

Цитата South:
тогда и _Application_ProcessMessages не нужен »
да, если была бы возможность всё делать в отдельном потоке.

Цитата South:
в цикле от "if _QUIT then Break; " не будет толку. если процесс первый в списке, то ты из цикла "while _ProcIsRunning(ProcessName, ProcessID) do;" не выйдешь. в этом же случае не сработает _Application_ProcessMessages »
Здесь я с вами полностью согласен, недоглядел...

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:18, 21-01-2010 | #893


Аватара для A1EXXX

Старожил


Сообщения: 178
Благодарности: 67

Профиль | Отправить PM | Цитировать


Inno Setup Compiler 5.3.7 build 100121 (English) by Restools
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:21, 21-01-2010 | #894


Новый участник


Сообщения: 29
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Serega:
Цитата South:
не очень понятно где это можно применить на практике, если только рассматривать этот вопрос как чисто академический »
При запуске распаковки архивов.
да вроде библиотек уже куча есть, хотя в данном случае не важно
Цитата:
Цитата South:
если вызвать ExecAndWait, то вызвавшая процедура/функция не завершится пока не завершится запущенное приложение.
а если после этого должны выполнится еще какие-то действия? »
Совершенно верно.
Видимо вы слабо знакомы с Inno Setup. Попробуйте запустить любую программу через Exec или ShellExec с параметром ожидания ewWaitUntilTerminated или запустить через [Run] и вы не сможите передвинуть окно инсталлятора.
про это я в курсе. кстати, если не лень, можете глянуть в исходники инно и посмотреть каким образом используется ewWaitUntilTerminated.
Цитата:
Цитата South:
сдается мне, что _ProcIsRunning вообще не в кассу, постоянно шмонать список процессов далеко не лучшее решение. »
Понятно, вы знакомы с программированием...
с программированием немного знаком
Цитата:
Самый простой вариант, это открыть файл через OpenProcess, если Handle > 0, то процесс работает...
может и простой, но работает дольше чем WaitForMultipleObjects,WaitForSingleObjects

Цитата:
Ну вообще-то, вы наверно заметили, что я сначала сверяю ID процесса, а затем его имя, т.е. чтоб определить, что это именно тот файл.
Не знаю, знаете вы или нет, но ID процесса в системе не уникален. После завершения этого процесса, его ID освобождается и при запуске другого процесса ему может быть присвоен системой точно такой же ID.
Так что проверка просто по ID, я счёл не совсем правильным и точным.
Ну а более простой способ узнать имя процесса через его ID, мне к сожалению не известен. Если вам известен более простой способ, то поделитесь, так сказать для само развития.
чтобы более наглядно было
Код: Выделить весь код
  TProcessInformation = record
    hProcess: THandle;
    hThread: THandle;
    dwProcessId: DWORD;
    dwThreadId: DWORD;
  end;
начнем с того, что я не предлагал использовать dwProcessId. я предложил использовать hProcess, который не будет освобожден, пока не вызван CloseHandle
Цитата:
Цитата South:
вообще для этих целей существует WaitForSingleObject »
Не согласен, инсталлятор, так же будет мёртвым, т.е. переместить вы его не сможете.
в общем случае да, будет мертвым, а если его использовать как я предложил, то должен ожить
Цитата:
Цитата South:
данные о запущенных процессах я бы заносил в массив »
и что дальше? Процесс закрылся, а с таким же ID, работает уже другой...
читаем выше, id не при чем
Цитата:
Цитата South:
по уму процедуру ожидания надо делать в отдельном потоке. в инно с этим проблемы, поэтому я бы запустил таймер (не очень хорошо, но на безрыбье ...), »
Совершенно с вами согласен, но стандартный Inno не поддерживает, не только многопоточность, он также не знает, что такое таймер (этот недостаток исправлен в версии от Restools). Если конечно не использовать дополнительных библиотек, а именно эту цель я и приследывал при написании данного скрипта, чтоб можно было использовать его без ничего.
да, пока не нажата кнопка 'install', приложение является однопоточным, только вот распаковку он может делать в несколько потоков. если по теме, то да, создавать потоки без привлечения самописных длл не получится. а про таймер, ваша религия позволила вам использовать системные библиотеки, так почему же не использовать SetTimer и KillTimer

Цитата:
Цитата South:
и была бы отдельная процедура прибития процессов при выходе из инсталла: прибили таймер и опять же пробежались по массиву и всем процессам TerminateProcess »
и прибили другой процесс...
Цитата South:
тогда и _Application_ProcessMessages не нужен »
да, если была бы возможность всё делать в отдельном потоке. »
не прибил бы, это все непонятки с PID'ом

Отправлено: 21:52, 21-01-2010 | #895


Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата South:
может и простой, но работает дольше чем WaitForMultipleObjects,WaitForSingleObjects »
здесь ничего возразить не могу, просто не знаю, кто быстрее.

Цитата South:
я предложил использовать hProcess, который не будет освобожден, пока не вызван CloseHandle »
Согласен, но сразу забыл сказать, что PI.hProcess, не знаю почему, но именно в Inno показывает не верное значение, может где-то, что я не так сделал…
Это можно увидеть, если добавить сообщение в функцию _StartProc, пример:
Код: Выделить весь код
  ProcessName:= ExtractFileName(Filename);
  ProcessId:= PI.dwProcessId;
  MsgBox('Запущена программа: ' + ProcessName + #13#10 +
         'PI.hProcess: ' + IntToStr(PI.hProcess) + #13#10 +
         '_OpenProcess: ' + IntToStr(_OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId)),
         mbInformation, MB_OK);
  _CloseHandle(PI.hProcess);
  _CloseHandle(PI.hThread);
Цитата South:
в общем случае да, будет мертвым, а если его использовать как я предложил, то должен ожить »
теоретически да, но я не пробовал, врать не буду.

Цитата South:
а про таймер, ваша религия позволила вам использовать системные библиотеки, так почему же не использовать SetTimer и KillTimer »
Причём тут религия? Попробуйте, в стандартной версии SetTimer и у вас вылетит ошибка. Цель написания скрипта была, чтоб с ним можно было работать в разных версиях Inno и не тащить с собой в инсталляторе дополнительные библиотеки.
А так понятно, можно было написать отдельную dll'ку и всего это скрипта не надо, но этих dll'ок и так уже куча...

P.S.
Код: Выделить весь код
const
  PROCESS_ALL_ACCESS = $000F0000 or $00100000 or $FFF;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 22:32, 21-01-2010 | #896


Новый участник


Сообщения: 29
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Serega:
Цитата South:
я предложил использовать hProcess, который не будет освобожден, пока не вызван CloseHandle »
Согласен, но сразу забыл сказать, что PI.hProcess, не знаю почему, но именно в Inno показывает не верное значение, может где-то, что я не так сделал…
Это можно увидеть, если добавить сообщение в функцию _StartProc, пример:
Код:
ProcessName:= ExtractFileName(Filename);
ProcessId:= PI.dwProcessId;
MsgBox('Запущена программа: ' + ProcessName + #13#10 +
'PI.hProcess: ' + IntToStr(PI.hProcess) + #13#10 +
'_OpenProcess: ' + IntToStr(_OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId)),
mbInformation, MB_OK);
_CloseHandle(PI.hProcess);
_CloseHandle(PI.hThread);
у меня в инно с PI.hProcess проблем не было
по поводу приведенного куска
hProcess:THandle, THandle=Longword
Код: Выделить весь код
Longint	        -2147483648..2147483647	signed 32-bit
Longword 	0..4294967295	                unsigned 32-bit
в инно - function IntToStr(i: Longint): String;
выводы по поводу IntToStr(PI.hProcess) должны быть очевидны

Цитата:
Цитата South:
в общем случае да, будет мертвым, а если его использовать как я предложил, то должен ожить »
теоретически да, но я не пробовал, врать не буду.
я вообще-то тоже не пробовал и полной уверенности, что это сработает нет, надо пробовать

Цитата:
Цитата South:
а про таймер, ваша религия позволила вам использовать системные библиотеки, так почему же не использовать SetTimer и KillTimer »
Причём тут религия? Попробуйте, в стандартной версии SetTimer и у вас вылетит ошибка. Цель написания скрипта была, чтоб с ним можно было работать в разных версиях Inno и не тащить с собой в инсталляторе дополнительные библиотеки.
А так понятно, можно было написать отдельную dll'ку и всего это скрипта не надо, но этих dll'ок и так уже куча...
я в своих скриптах никогда не использовал версии от ResTools (если это имелось ввиду), только только стандартный инно, даже препроцессор никогда не использовал. и SetTimer у меня всегда работал. только вот ему нужна innocallback.dll, тут я не подумал, каюсь

ЗЫ все-таки для данной задачи в такой постановке достаточно WaitForSingleObjects. если интересно можно посмотреть на руборде в шапке скрипт ExecAppAndMoveWindow.iss. давненько делал, тоже была задача без привлечения внешних длл запустить приложение и переместить его окно и тоже для распаковки внешних архивов . там и hProcess, и WaitForSingleObjects используется, а общий подход примерно такой же

ЗЗЫ тут глянул, в TStartupInfo 3 поля являются указателями, ты же их обзываешь Longint'ом, который может принимать отрицательные значения, при этом не инициализируешь все поля, хотя это нужно делать.
попробуй эти три поля объявить как Longword, обнули все поля которые не заполняешь конкретными значениями (обычно вызывают FillChar(TStartupInfo , SizeOf(TStartupInfo ), 0)). после этого вызывай CreateProcess, тогда возможно Longword нормально приведется к Pointer и в ответ нормально заполнится TProcessInformation

Последний раз редактировалось South, 22-01-2010 в 00:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:32, 21-01-2010 | #897


Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата South:
выводы по поводу IntToStr(PI.hProcess) должны быть очевидны »
Согласен.
Цитата South:
скрипт ExecAppAndMoveWindow.iss. давненько делал »
Нашёл у себя на диске этот скрипт, интересно и если вы говорите, что его писали давно...

Приятно познакомиться с экспертом...

Эх, давненько я не просматривал архив со скриптами, не пришлось бы над многим ломать голову.
Кстати запускается там файл у вас через ShellExec, а не через CreateProcess и я попробовал такой вариант:
Код: Выделить весь код
    while WaitForSingleObject(PI.hProcess, 50) = WAIT_TIMEOUT do
      _Application_ProcessMessages;
Действительно работает Спасибо.

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 00:12, 22-01-2010 | #898


Новый участник


Сообщения: 29
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Serega:
скрипт ExecAppAndMoveWindow.iss. давненько делал »
Нашёл у себя на диске этот скрипт, интересно и если вы говорите, что его писали давно...
Приятно познакомиться с экспертом...
взаимно, хотя я себя экспертом не считаю
Цитата:
Эх, давненько я не просматривал архив со скриптами, не пришлось бы над многим ломать голову.
Кстати запускается там файл у вас через ShellExec, а не через CreateProcess и я попробовал такой вариант:
Код:
while WaitForSingleObject(PI.hProcess, 50) = WAIT_TIMEOUT do
_Application_ProcessMessages;
Действительно работает Спасибо. »
я тоже нашел у себя этот скрипт, теперь сижу и думаю: почему я тогда не использовал CreateProcess, а стал городить огород с поиском хэндла и идентификатора процесса

вот так вот, из 2 скриптов можно уже собрать что-то человеческое

PS а вот тут я выкладывал этот скрипт. правда поиск местонахождения скрипта так и не прояснил не использование CreateProcess видимо я тогда изрядно ступил

Последний раз редактировалось South, 22-01-2010 в 01:09.


Отправлено: 00:50, 22-01-2010 | #899


Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата South:
теперь сижу и думаю: почему я тогда не использовал CreateProcess, а стал городить огород с поиском хэндла »
У меня тоже не с первого раза вышло. Сначала искал и загонял в массив, как вы и предлагали, только я туда заносил ещё и дочерние процессы запущенной программы, чтоб потом всех их за одно, если чего...
Потом смотрю, чего-то много строк в скрипте получается... решил лишнее не делать, а в итоге оказывается можно ещё проще где-то ещё на 50-70 строк

Цитата South:
вот так вот, из 2 скриптов можно уже собрать что-то человеческое »
согласен

Цитата South:
PS а вот тут я выкладывал этот скрипт. правда поиск местонахождения скрипта так и не прояснил »
Хм, я тогда бы и не разобрался... это только сейчас начинаю немного понимать чего куда...

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Последний раз редактировалось Serega, 22-01-2010 в 01:25.


Отправлено: 01:11, 22-01-2010 | #900



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » [архив] Скрипты Inno Setup. Помощь и советы [часть 2]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Inno Setup .:[все вопросы]:. Mchik Автоматическая установка приложений 1329 23-08-2009 20:13
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход