Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
Гость_Kindly_*
|
17:03:2005, 16:05
|
|
Инопланетный гость |
(Вопрос по Inno Setup 5) Я извиняюсь за вопрос немножко не в тему. Меня интереcует написание скрипта на Pascal следующего характера: Перед запуском инсталлятора нужна проверка реестра на определённый ключ, и если он существует - должен запускаться мастер инсталляции, а если ключ не существует, то должна вылетать мессага, что прога не найдена - жмите OK чтобы покинуть мастер (ну или другой текст). Вобщем вы программеры - для вас скриптик или только секцию кода написать не составит труда. Поможете такому как мне?
mailto:gubei_vadim@list.ru |
|
Сообщение
#1
|
|
![]() |
|
Гость_Kindly_*
|
4:05:2005, 10:27
|
|
Инопланетный гость |
Извиняюсь за офтопик, но не знаю куда и кому написать следующий вопрос:
Многие инсталляторы создают логи, в которых можно засечь инсталляцию всех файлов и значений реестра. Но возникает проблема, когда надо перепаковать программу, в которой не было этого лога, например, его использование было отключено. С помощью какой программы-шпиона можно вычислить все происходящие события в Windows, т.е. например: какие файлы и когда были переименованы, установленны, перемещены; какие значения в реестр добавляются и т.п.? Чтобы правильно собрать инсталлятор. |
|
Сообщение
#31
|
|
|
|
4:05:2005, 15:24
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
FileMon, RegMon, а также различные отладчики типа W32dsm
|
|
Сообщение
#32
|
|
|
Гость_Kindly_*
|
14:05:2005, 08:02
|
|
Инопланетный гость |
С отладчиками чет не очень, но File Mon рулит, сенкс.
Вопрос следующий: Написал я скрипт, в котором при инициализации проверяется присутствие определенного ключа, и, если он существует, то выводится сообщение о том, не желает ли пользователь удалить уже установленное приложение "Yes/No" (это если инсталлятор запускается второй раз). При этом напрямую прописывается путь к деинсталлятору, например: {win}\proga\unins00.exe И через функцию Exec выполняется деинсталлятор, если пользователь выберет "Yes". Вопрос в том, имеет ли Inno Setup возможность запускать приложения или выполнять другие файлы исходя из значений реестра? Например, если путь деинсталлятора прописан в папку с программой; ведь при инициализации это (если возможно) уже нужно делать через реестр же? |
|
Сообщение
#33
|
|
|
Гость_Kindly_*
|
14:05:2005, 08:35
|
|
Инопланетный гость |
Может начинаю надоедать - вопрос другой, т.е. повторюсь.
Возможно ли проигрывание музыки XM или MOD в инсталляторе через соответствующую .dll-ку XM_Music.dll ? Вот она: ]]>http://make3d.narod.ru/xm_music/index.htm]]> Если ссылка не рабочая, то попробуйте скачать XM_Music.dll отсюда: ]]>http://user.kem.ru/pro/delphi_utl.php]]> Если будет время и настроение, то посмотрите, пожалуйста, можно ли с этим что либо сделать? |
|
Сообщение
#34
|
|
|
|
14:05:2005, 09:07
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Будет время, гляну ваши вопросы.
|
|
Сообщение
#35
|
|
|
|
15:05:2005, 17:06
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Вопрос в том, имеет ли Inno Setup возможность запускать приложения или выполнять другие файлы исходя из значений реестра? Например, если путь деинсталлятора прописан в папку с программой; ведь при инициализации это (если возможно) уже нужно делать через реестр же? Это пример, как проверить установлена ли в системе Delphi. В вашем случае, аналогично, надо проверить присуствие определенного ключа в реестре и если он есть, прочитать значение ключа, где указан путь к unins00.exe, затем получив путь к данному файлу, запустить его функцией InstShellExec, см. пример ниже. Цитата Возможно ли проигрывание музыки XM или MOD в инсталляторе через соответствующую .dll-ку XM_Music.dll ? Средствами InnoSetup проигрывание музыки в формате XM или MOD сделать большой гимор, если вообще возможно, практически не пробовал. Можно сделать для этого программку, которую запускать в InnoSetup, а еще проще вот вариант, с помощью которого можно запустить звуковой файл менее экзотического формата (*.wav, mp3 и т. п.):
|
|
Сообщение
#36
|
|
|
|
15:05:2005, 19:01
|
|
Новенький Группа: Новенький Сообщений: 58 Регистрация: 2:05:2005 Из: Краснодар Пользователь №: 1 682 Репутация: 0
|
вообще не по теме вопрос
|
|
Сообщение
#37
|
|
|
|
15:05:2005, 19:13
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
_dimka_
Вообще то тема называется Delphi и Pascal. В инсталляторе InnoSetup используются скрипты на языке Pascal, так что вполне в тему. |
|
Сообщение
#38
|
|
|
Гость_Kindly_*
|
17:05:2005, 14:43
|
|
Инопланетный гость |
Zubr, спасибо большое. Вы как всегда на высоте
|
|
Сообщение
#39
|
|
|
Гость_Kindly_*
|
18:05:2005, 12:30
|
|
Инопланетный гость |
Такой функции (InstShellExec) в пятой версии вроде как нет, но можно и так:
Цитата function InitializeSetup(): Boolean; var res: Integer; begin Result:=True; ShellExec('play', ExpandConstant('{sd}\music.mp3'), '', '', SW_HIDE, ewNoWait, res) end; Но вот в чем требуемая фишка: хотелось бы, чтобы файл предварительно загружался во временную папку и сразу запускался из нее именно при инициализации (как сделать это в начале инсталляционного процесса я примерно знаю), а затем закрывался (или закрывалась, если это программа) после завершения инсталляции. Это возможно? Если да, то как? Если нет, то затея не удалась, да и особо не нужна она в принципе. Вот это мне действительно нужно: я так и не разобрался: Цитата function InitializeSetup(): Boolean; var ResultStr: String; ResultCode: Integer; begin Result:=True; RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program_is1', 'UninstallString', ResultStr); if ResultStr='???' \\ведь константа какая-то нужна? Или это лишнее? then begin if not ShellExec(???), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then MsgBox('Ошибка удаления.' #13#13 '' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK); end; end; Ну, вроде как функцию RegQueryStringValue надо использовать, так? Ну, вроде считываем параметр деинсталлятора - 'UninstallString'. Ну, вроде ResultStr - это и есть (значение) прямой путь к деинсталлятору (включая сам деинсталлятор *.exe). А дальше не врубаюсь, помогите, пожалуйста... |
|
Сообщение
#40
|
|
|
|
18:05:2005, 19:57
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Вот код решающий оба ваших вопроса:
|
|
Сообщение
#41
|
|
|
Гость_Kindly_*
|
21:05:2005, 14:40
|
|
Инопланетный гость |
Спасибо Вам, будем пробовать
|
|
Сообщение
#42
|
|
|
Гость_Kindly_*
|
22:05:2005, 14:46
|
|
Инопланетный гость |
Получилось, но всё равно немного переделал под пятую версию:
Цитата function InitializeSetup(): Boolean; var res:Integer; ResultCode: Integer; s, ResultStr:string; begin ExtractTemporaryFile('Temp_Program.exe'); s:=ExpandConstant('{tmp}')+'\Temp_Program.exe'; Exec(s, '', '', SW_SHOWMINIMIZED, ewNOWait, res); Result:=True; begin If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Restorator 2005_is1', 'UninstallString', ResultStr) then begin If ResultStr<>'' then begin ResultStr:=RemoveQuotes(ResultStr); If MsgBox('Программа My Program уже установлена, удалить ее?', mbInformation, MB_OKCANCEL)=IDOK then if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK); end; end; end; end; Вопрос следующий: как закрыть (или завершить процесс) программу, запущенную из временной папки перед завершением установки, используя средства Inno Setup? Это ведь лучше через процедуру DeInitializeSetup делать? У меня после успешного решения данного вопроса сразу отпадает потребность воспроизведения *.xm и *.mod, т.к. уже найден конвертер этих файлов в EXE. На данный момент это последнее, что меня интересует. Поможете? |
|
Сообщение
#43
|
|
|
|
23:05:2005, 17:32
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Вопрос следующий: как закрыть (или завершить процесс) программу, запущенную из временной папки перед завершением установки, используя средства Inno Setup? Если программка Temp_Program.exe не консольная, то можно передать ей сообщение WM_CLOSE, иначе проблема сложнее, средствами InnoSetup не получится. Здесь 'WMPlayerApp' класс окна закрываемого приложения, чтобы его определить можно воспользоваться программой VIEWWIND. |
|
Сообщение
#44
|
|
|
Гость_Kindly_*
|
25:05:2005, 08:05
|
|
Инопланетный гость |
Спасибо, очень интересно. Я вот не знаю даже: сама программка Temp_Program.exe не консольная, т.е. обычное Win32 приложение, которое напоминает классический интерфейс Winamp-а, но она создана консольным "Досовским" приложением, поэтому я теряюсь в точном ответе, т.к. не знаю, может ли считаться программа Win32, если она была создана Досовским/консольным приложением. Но судя по всем признакам (проверка PE анализаторами) - программка не консольная.
Получается, что дело остаётся "за малым". Какую-то программу VIEWWIND я нашёл через поисковик, но что-то сомневаюсь, что она может определить класс окна приложения. Сама по себе она консольная и даже не имеет описания, как ей пользоваться, даже не запускается через командную строку (возможно, это исходники |
|
Сообщение
#45
|
|
|
|
26:05:2005, 03:35
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
В вашем случае, если при проигрывании звукового файла, вы закрываете программку Temp_Program.exe и проигрывание прекращается, то все должно получиться.
Программу ViewWindow отправил вам на Email. |
|
Сообщение
#46
|
|
|
Гость_Kindly_*
|
26:05:2005, 06:42
|
|
Инопланетный гость |
Спасибо большое. Очень хорошая программка.
|
|
Сообщение
#47
|
|
|
Гость_Kindly_*
|
27:05:2005, 06:03
|
|
Инопланетный гость |
Всё получилось, только есть один момент:
Код Цитата procedure DeInitializeSetup(); var h:Longint; begin h:=FindWindowByClassName('XM-EXE-WINDOW'); If h<>0 then SendMessage(h, 16, 0, 0); begin MsgBox('Работа мастера завершена.', mbInformation, MB_OK); end; end; Когда инсталлятор закрывается, программа Temp_Program.exe закрывается, но не удаляется, т.к. видимо не хватает времени для выгрузки из временной директории. Поэтому мне пришлось "схитрить", вставив соответствующее сообщение. Вопрос: можно ли заставить выгружаться временные файлы (в данном случае) при выходе инсталлятора без соответствующего сообщения, например, сделать задержку? И ещё один, думаю, понравится Есть такая директива AppMutex. Эта директива используется для предотвращения установки новой версии программы, если программа выполняется в данный момент, и удаления запущенного в данный момент приложения. В ней нужно указать ограничители. Если ограничители присутствуют, инсталятор/деинсталятор выдаст сообщение: "[Setup или Uninstall] обнаружил, что [AppName] выполняется. Пожалуйста, завершите работу приложения, а потом нажмите ОК для продолжения или Cancel для отмены". Но для этого нужно добавление в программу/инсталлятор соответствующего кода. Например, вот код на Delphi: Цитата CreateMutex(nil, False, 'MyProgramsMutexName'); А в секции Setup после этого прописать следующее: Цитата AppMutex=MyProgramsMutexName Вот только не знаю как расписать код для создания Mutex. Если Вам не сложно, напишите, пожалуйста, примерчик. |
|
Сообщение
#48
|
|
|
|
28:05:2005, 04:20
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Вопрос: можно ли заставить выгружаться временные файлы (в данном случае) при выходе инсталлятора без соответствующего сообщения, например, сделать задержку? Попробуйте вместо функции MsgBox поставить функцию Sleep(500) - здесь аргумент 500 количество милисекунд задержки. Цитата Есть такая директива AppMutex. Эта директива используется для предотвращения установки новой версии программы, если программа выполняется в данный момент, и удаления запущенного в данный момент приложения. Есть смысл использовать данную директиву, если вы делаете инсталлятор для своей программы, в которой вы можете установить мутекс, как в Help написано CreateMutex(nil, False, 'MyProgramsMutexName'). В вашем случае так не получится, но можно исхитриться по другому, все через тот же класс окна: end; |
|
Сообщение
#49
|
|
|
Гость_Kindly_*
|
28:05:2005, 07:16
|
|
Инопланетный гость |
Спасибо большое. Думаю, разберусь с этим и всё будет правильно работать.
Zubr, а Вы настоящий Гуру в написании скрипта для инсталлятора (да и не только, наверное |
|
Сообщение
#50
|
|
|
Гость_Kindly_*
|
31:05:2005, 13:58
|
|
Инопланетный гость |
У меня созрел вопрос "косметического" характера:
Видел инсталляторы (Inno Setup), в которых в фоновое окно вставлено изображение, причём отличающееся от изображения, которое на панели мастера. Я только знаю, как вывести в фоновое окно изображение мастера: Цитата procedure InitializeWizard(); var BackgroundBitmapImage: TBitmapImage; begin CreateTheWizardPages; BackgroundBitmapImage := TBitmapImage.Create(MainForm); BackgroundBitmapImage.Left := 50; BackgroundBitmapImage.Top := 100; BackgroundBitmapImage.AutoSize := True; BackgroundBitmapImage.Bitmap := WizardForm.WizardBitmapImage.Bitmap; BackgroundBitmapImage.Parent := MainForm; end; А как вывести внешнее изображение не знаю. Может Вы сталкивались с такой ситуацией? И ещё один: при установке на панели выбора папки установки отображается количество требуемого дискового пространства. Как сделать, чтобы чуть выше отображалась информация о доступном пространстве на выбранном диске? |
|
Сообщение
#51
|
|
|
|
3:06:2005, 03:49
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Видел инсталляторы (Inno Setup), в которых в фоновое окно вставлено изображение, причём отличающееся от изображения, которое на панели мастера. Вы уверены, что это было сделано в InnoSetup? В InnoSetup (4-ая версия) я такой возможности не нашел. Цитата при установке на панели выбора папки установки отображается количество требуемого дискового пространства. Как сделать, чтобы чуть выше отображалась информация о доступном пространстве на выбранном диске? Не знаю, никогда не сталкивался с этим вопросом. Будет время посмотрю. |
|
Сообщение
#52
|
|
|
|
5:06:2005, 15:34
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата В InnoSetup (4-ая версия) я такой возможности не нашел. Извиняюсь, есть такая возможность. Здесь MyImage.bmp - внешнее изображение. Цитата при установке на панели выбора папки установки отображается количество требуемого дискового пространства. Как сделать, чтобы чуть выше отображалась информация о доступном пространстве на выбранном диске? Сделать можно, но очень гиморно. |
|
Сообщение
#53
|
|
|
Гость_Kindly_*
|
6:06:2005, 07:06
|
|
Инопланетный гость |
Спасибо большое. Я уже хотел в доказательство Вам скриншоты на мыло выслать
|
|
Сообщение
#54
|
|
|
Гость_Kindly_*
|
7:06:2005, 07:09
|
|
Инопланетный гость |
Хорошо. А как можно замостить фоновую картинку так, чтобы при любом изменении разрешения экрана она оставалась растянутой до краёв, чтобы не выходила за пределы фонового окна и чтобы меньше его не была? В виденных мной инсталляторах именно так и было. Я 2 часа промучался, но так и не достиг требуемого результата.
|
|
Сообщение
#55
|
|
|
|
7:06:2005, 17:37
|
|
Божественный Группа: Модеры Сообщений: 937 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Я 2 часа промучался, но так и не достиг требуемого результата. Ну 2 часа это не много, бывает приходится мучиться 2 дня, а то и 2 недели Вот код решающий ваш вопрос:
|
|
Сообщение
#56
|
|
|
Гость_Kindly_*
|
9:06:2005, 06:50
|
|
Инопланетный гость |
Просто класс! То что нужно.
|
|
Сообщение
#57
|
|
|
Гость_Snаke_*
|
21:06:2005, 01:07
|
|
Инопланетный гость |
Здраствуйте. Я в Inno Setup начал делать инсталляторы неда |