Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
Гость_Kindly_*
|
17:03:2005, 16:05
|
|
Инопланетный гость |
(Вопрос по Inno Setup 5) Я извиняюсь за вопрос немножко не в тему. Меня интереcует написание скрипта на Pascal следующего характера: Перед запуском инсталлятора нужна проверка реестра на определённый ключ, и если он существует - должен запускаться мастер инсталляции, а если ключ не существует, то должна вылетать мессага, что прога не найдена - жмите OK чтобы покинуть мастер (ну или другой текст). Вобщем вы программеры - для вас скриптик или только секцию кода написать не составит труда. Поможете такому как мне?
mailto:gubei_vadim@list.ru |
|
Сообщение
#1
|
|
![]() |
|
|
17:03:2005, 16:18
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Пример проверки инсталлятором установлена ли в системе Delphi, если нет, то инсталляция завершается:
|
|
Сообщение
#2
|
|
|
Гость_Kindly_*
|
19:03:2005, 13:46
|
|
Инопланетный гость |
zubr, спасибо огромное
Например, я создал русификатор, который поместил в инсталлятор (Inno Setup 5). Проверка на ключ прошла успешно, путь установки также взят из реестра - жмём "Установить"/// Вопрос следующий: имеется ли возможность у самого инсталлятора проверять наличие определённого файла в папке назначения после нажатия кнопки "Установить". Например, если файл отсутствует (который должен проверяться) - должно появиться сообшение "Выбрана неверная папка!" (или т.п.). Если не трудно, опишите это, пожалуйста, на примере - этим Вы поможете многим локализаторам софта. Ну, и чтобы лишний раз не постить, спрошу; если вышеописанная функция возможна, то возможна ли проверка требуемого файла (в папке назначения) на такие атрибуты как размер и CRC сумма? |
|
Сообщение
#3
|
|
|
|
19:03:2005, 19:51
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Вопрос следующий: имеется ли возможность у самого инсталлятора проверять наличие определённого файла в папке назначения после нажатия кнопки "Установить". Например, если файл отсутствует (который должен проверяться) - должно появиться сообшение "Выбрана неверная папка!" (или т.п.). Такая возможность есть. Вот пример кода, где имя файла www.sss: Здесь CurPage=5. Определить CurPage можно в отладке. Запускаешь процесс инсталляции в InnoSetup клавишей F7, когда шаг доходит до строки CurPage, наводишь на нее курсор, всплывающая подсказка покажет значение CurPage. Цитата если вышеописанная функция возможна, то возможна ли проверка требуемого файла (в папке назначения) на такие атрибуты как размер и CRC сумма? В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться. |
|
Сообщение
#4
|
|
|
Гость_Kindly_*
|
20:03:2005, 08:57
|
|
Инопланетный гость |
Цитата В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться. В смысле, внешняя программка сначала будет загружаться и, обнаружив файл, проверит, например, CRC сумму и выдаст сообщение, например "У вас программа соответствующей версии. Запустить мастер установки?" Или эта программка будет вызываться инсталлятором для проверки непосредственно перед самим процессом инстялляции, и после проверки будет ли программка посылать ответ инталлятору, который будет принимать соответствующие дейтвия? zubr Вы из Беларуси? Я - да. Вы уже в курсе дела, может договоримся о написании Вами этой программки? |
|
Сообщение
#5
|
|
|
|
20:03:2005, 14:22
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата В смысле, внешняя программка сначала будет загружаться и, обнаружив файл, проверит, например, CRC сумму и выдаст сообщение, например "У вас программа соответствующей версии. Запустить мастер установки?" Эта программка будет запакована в инсталляционный файл вместе с другими файлами инсталляционного пакета. Цитата Или эта программка будет вызываться инсталлятором для проверки непосредственно перед самим процессом инстялляции, и после проверки будет ли программка посылать ответ инталлятору, который будет принимать соответствующие дейтвия? Лучше всего сделать, чтобы мастер установки запускал эту программку проверки, когда юзер выбрал каталог, куда будет устанавливаться ваша программа. Программка выполнит проверки, и в зависимости от результатов выполнит соответствующие действия (даст возможность продолжить процесс установки; выдаст сообщение о невозможности дальнейшей установки и остановит процесс установки и т. п.) Я тоже из Беларуси. Напишите мне rozin@tut.by |
|
Сообщение
#6
|
|
|
Гость_Kindly_*
|
21:03:2005, 07:33
|
|
Инопланетный гость |
Пока я думаю, как правильно сформулировать свою просьбу, позвольте задать ещё один вопрос:
Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе). Причём резервные файлы чтобы сохранялись в папку, например: "backup", без переименования расширений. И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)? |
|
Сообщение
#7
|
|
|
|
21:03:2005, 07:55
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе). Опять таки искать файл и если он есть, создать папку "backup", к примеру, в том же каталоге куда устанавливается программа, и скопировать файл в "backup". Все это можно сделать средствами InnoSetup. Цитата И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)? Можно через компоненты. У меня на работе под рукой Inno Setup нет, подробнее смогу, если время будет вечером. |
|
Сообщение
#8
|
|
|
|
21:03:2005, 20:25
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Здесь файл MyProg.exe и есть с которого делается копия. |
|
Сообщение
#9
|
|
|
Гость_Kindly_*
|
6:04:2005, 07:03
|
|
Инопланетный гость |
Долго не имел возможности ответить, поэтому сейчас выражаю безразмерную благодарность за оказанную Вами, zubr, помощь. Что касается "окончательного" вопроса, так он состоит в следующем:
Можно ли в Inno Setup произвести деинсталляцию так, чтобы при удалении установленных файлов, при предварительном создании резервных копий перезаписываемых файлов, резервные файлы восстанавливались на свои прежние места, а сама папка (резервных файлов) удалялась? |
|
Сообщение
#10
|
|
|
|
6:04:2005, 15:58
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Чисто средствами Inno Setup такое не получится. Это надо будет делать свой UnInstall.exe, а в проекте Inno Setup сделать следующее:
|
|
Сообщение
#11
|
|
|
Гость_Kindly_*
|
7:04:2005, 08:26
|
|
Инопланетный гость |
Спасибо большое! Благодаря Вам я узнал всё то, что меня интересовало по данной теме. Хорошо хоть "земляки" откликнулись, а то на российских форумах молчат =).
|
|
Сообщение
#12
|
|
|
|
7:04:2005, 15:32
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Рад был помочь
|
|
Сообщение
#13
|
|
|
Гость_Kindly_*
|
9:04:2005, 07:41
|
|
Инопланетный гость |
У меня всё ещё появилось два вопроса следующего содержания.
1. Всё-таки сохранение резервных файлов через Компоненты влечёт добавление в инсталлятор дополнительных файлов, из-за чего размер инсталлятора может оказаться довольно большим. Вопрос состоит в том, как изменить расширения перезаписываемых оригинальных файлов, например, на *.bak или *.exe.bak при перезаписи обновлёнными (чтобы без добавлеине резервируемых файлов)? 2. В Inno Setup 5 всё-таки имеется функция подсчёта размера файла. Только я не въезжаю как секцию правильно написать. В хелпе написано следующее: Образец: function FileSize(const Name: String; var Size: Integer): Boolean; Описание: Задаёт Size - размер указанного файла в байтах. Возвращает True, если размер файла задан успешно, иначе возвращает False. Помогите, пожалуйста, вписать вышеупомянутую функцию так, чтобы она выполняла проверку уже после нажатия кнопки "Установить", т.е. перед самим процессом инсталляции и так, чтобы при несоответствии размера вылетало собщение, после которого мастер установки прекращал дальнейшие действия, или чтобы данная проверка запускалась сразу после проверки на наличие определённого файла в папке с программой. |
|
Сообщение
#14
|
|
|
|
9:04:2005, 13:25
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Всё-таки сохранение резервных файлов через Компоненты влечёт добавление в инсталлятор дополнительных файлов, из-за чего размер инсталлятора может оказаться довольно большим. Вопрос состоит в том, как изменить расширения перезаписываемых оригинальных файлов, например, на *.bak или *.exe.bak при перезаписи обновлёнными (чтобы без добавлеине резервируемых файлов)? Непонятно какие файлы на какие вы будете перезаписывать, если в инсталляторе ничего не будет. Цитата В Inno Setup 5 всё-таки имеется функция подсчёта размера файла. Только я не въезжаю как секцию правильно написать. В хелпе написано следующее: Образец: function FileSize(const Name: String; var Size: Integer): Boolean; Описание: Задаёт Size - размер указанного файла в байтах. Возвращает True, если размер файла задан успешно, иначе возвращает False. Да функция FileSize, но вам же надо было еще CRC. Функция FileSize работает следующим образом: в переменной Name имя и путь к проверяемому файлу, в переменной Size, после выполнения функции будет размер проверяемого файла. Если функция сработала успешно, то она возвращает True, в противном случае False.
|
|
Сообщение
#15
|
|
|
Гость_Kindly_*
|
11:04:2005, 11:58
|
|
Инопланетный гость |
Хоть я и не соображаю в программировании, но здесь более удачное решение сохранения резервных копий файлов без изменения расширения, и без всяких компонентов.
Цитата procedure CurStepChanged(CurStep: TSetupStep); var s1, s2:string; begin s1:=ExpandConstant('{app}')+'\My.exe'; s2:=ExpandConstant('{app}')+'\Backup'; If FileExists(s1) then begin CreateDir(s2); FileCopy(s1, s2+'\My.exe', True); end; end; Здесь резервное копирование оригинального файла происходит после нажатия кнопки "Установить", а если файл не существует, то будет создан BACKUP того файла, что установился из инсталлятора, если отключены проверки на его присутствие. |
|
Сообщение
#16
|
|
|
Гость_Kindly_*
|
11:04:2005, 12:02
|
|
Инопланетный гость |
Вопрос следующий:
Здесь идёт проверка на присутствие двух определённых файлов: 'my.dll' и 'my.exe'. При отсутствии 'my.exe' - вылетает мессага, а при отсутствии 'my.dll'- ничего не вылетает, но установка не продолжается. А если вписать мессагу после проверки 'my.dll', то проверка 'my.exe' при присутствии в порверяемой папке 'my.dll' будет игнорироваться. Как правильно вклеить мессагу так, чтобы все проверки совершались правильно и чтобы после удачных проверок не вылетало "лишнего" сообщения? В чём недочёт или ошибка? Цитата function NextButtonClick(CurPage: Integer): Boolean; var s:string; begin Result:=True; If CurPage=6 then begin If FileSearch('my.dll', ExpandConstant('{app}')='' then Result := False begin If FileSearch('my.exe', ExpandConstant('{app}')='' then begin s:='Выбрана неверная папка!'; MsgBox(s, mbCriticalError, mb_Ok); Result:=False; end; end; end; end; ОГРОМНОЕ СПАСИБО. |
|
Сообщение
#17
|
|
|
|
11:04:2005, 15:59
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Хоть я и не соображаю в программировании, но здесь более удачное решение сохранения резервных копий файлов без изменения расширения, и без всяких компонентов. Ну вы сами спрашивали: Цитата Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе). Причём резервные файлы чтобы сохранялись в папку, например: "backup", без переименования расширений. И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)? Компоненты позволяют, чтобы пользователь мог сделать выбор. Не понимаю почему вы считаете, что компоненты добавляют файлы в инсталлятор. От того что у вас 2 компонента с одинаковым файлом, это не значит, что инсталлятор скомпонуется с 2-мя одинаковыми файлами. Цитата Здесь идёт проверка на присутствие двух определённых файлов: 'my.dll' и 'my.exe'. При отсутствии 'my.exe' - вылетает мессага, а при отсутствии 'my.dll'- ничего не вылетает, но установка не продолжается. А если вписать мессагу после проверки 'my.dll', то проверка 'my.exe' при присутствии в порверяемой папке 'my.dll' будет игнорироваться. Как правильно вклеить мессагу так, чтобы все проверки совершались правильно и чтобы после удачных проверок не вылетало "лишнего" сообщения? В чём недочёт или ошибка? Здесь можно сделать так:
|
|
Сообщение
#18
|
|
|
Гость_Kindly_*
|
12:04:2005, 13:01
|
|
Инопланетный гость |
Цитата Здесь можно сделать так: А ещё так: Цитата function NextButtonClick(CurPage: Integer): Boolean; var s:string; begin Result:=True; If CurPage=6 then begin If FileSearch('my.dll', ExpandConstant('{app}')='' then begin s:='Выбрана неверная папка!'; MsgBox(s, mbCriticalError, mb_Ok); Result := False end else begin If FileSearch('my.exe', ExpandConstant('{app}')='' then begin s:='Выбрана неверная папка!'; MsgBox(s, mbCriticalError, mb_Ok); Result:=False; end; end; end; end; Это ж можно проверить абсолютно все файлы! |
|
Сообщение
#19
|
|
|
Гость_Kindly_*
|
12:04:2005, 13:03
|
|
Инопланетный гость |
Помогите, пожалуйста, логически завершить данную секцию кода. Здесь происходит проверка размера файла после нажатия кнопки "Установить", а также резервное копирование оригинального файла:
Цитата procedure CurStepChanged(CurStep: TSetupStep); var s, s1, s2:string; sz:Integer; begin If FileSize(ExpandConstant('{app}')+'\#1 DVD Ripper.exe', sz) then begin If sz<>921600 then begin s:='Несоответствие размера файла! Обновляемый файл изменён или имеет другую версию. Операция отменена!'; MsgBox(s, mbCriticalError, mb_Ok); end else begin s1:=ExpandConstant('{app}')+'\#1 DVD Ripper.exe'; s2:=ExpandConstant('{app}')+'\Backup'; If FileExists(s1) then begin CreateDir(s2); FileCopy(s1, s2+'\#1 DVD Ripper.exe', True); end; end; end; end; После применения данной секции перед установкой происходит сначала проверка на размер, и при его несоответствии вылетает соответствующее сообщение, но установка после нажатия кнопки "OK" продолжается, а хотелось бы, чтобы в таком случае установка прекращалась. Что нужно дописать? Спасибо огромное. |
|
Сообщение
#20
|
|
|
|
12:04:2005, 14:41
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата А ещё так: Цитата function NextButtonClick(CurPage: Integer): Boolean; var s:string; begin Result:=True; If CurPage=6 then begin If FileSearch('my.dll', ExpandConstant('{app}'='' then begin s:='Выбрана неверная папка!'; MsgBox(s, mbCriticalError, mb_Ok); Result := False end else begin If FileSearch('my.exe', ExpandConstant('{app}'='' then begin s:='Выбрана неверная папка!'; MsgBox(s, mbCriticalError, mb_Ok); Result:=False; end; end; end; end; Это ж можно проверить абсолютно все файлы! Все таки красивее будет мой вариант: Для следующего файла добавляете or (FileSearch('next.exe', ExpandConstant('{app}')='') Цитата Помогите, пожалуйста, логически завершить данную секцию кода. Здесь происходит проверка размера файла после нажатия кнопки "Установить", а также резервное копирование оригинального файла: Цитата procedure CurStepChanged(CurStep: TSetupStep); var s, s1, s2:string; sz:Integer; begin If FileSize(ExpandConstant('{app}'+'\#1 DVD Ripper.exe', sz) then begin If sz<>921600 then begin s:='Несоответствие размера файла! Обновляемый файл изменён или имеет другую версию. Операция отменена!'; MsgBox(s, mbCriticalError, mb_Ok); end else begin s1:=ExpandConstant('{app}'+'\#1 DVD Ripper.exe'; s2:=ExpandConstant('{app}'+'\Backup'; If FileExists(s1) then begin CreateDir(s2); FileCopy(s1, s2+'\#1 DVD Ripper.exe', True); end; end; end; end; Ну здесь, во первых, надо добавить иначе проверка на размер файла будет проводиться на всех шагах установки, что может вызвать исключительную ситуацию. Чтобы дальше установка не продолжалась, если проверка не прошла делаете так:
|
|
Сообщение
#21
|
|
|
Гость_Kindly_*
|
13:04:2005, 08:04
|
|
Инопланетный гость |
CПАСИБО!
Всё таки с резервным копированием я окончательно разобрался. Оказывается, когда Вы предложили решение с копированием через компоненты - всё было правильно, но в функции MyProgCheck нужно было задать True вместо False в FileCopy. Задание False всё-таки подразумевает копирование дополнительно включаемых файлов в инсталлятор. (Например, очень даже полезно при инсталляции перепакованной игры при отметке юзером "Русская версия" - происходит установка русификатора (дополнительно включаемых файлов), а при неотмеченном компоненте - русификатор устанавливаться не будет. Может есть и проще решение для этого, но вполне для этого годится и такой вариант.) А что б не было назойливого выбора типов установки следует написать: Цитата [Components] Name: "Backup"; Description: "Сохранить резервные копии файлов" [Types] Name: "Backup"; Description: "Выборочная установка"; Flags: iscustom так красивее. Спасибо за "ошибку":)! |
|
Сообщение
#22
|
|
|
|
13:04:2005, 15:33
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Всё таки с резервным копированием я окончательно разобрался. Оказывается, когда Вы предложили решение с копированием через компоненты - всё было правильно, но в функции MyProgCheck нужно было задать True вместо False в FileCopy. Задание False всё-таки подразумевает копирование дополнительно включаемых файлов в инсталлятор. В функции FileCopy, если 3-й параметр в False, то функция копирует файл в указанный каталог не проверяя существует там уже такой файл или нет, а при параметре True, такая проверка осуществляется. На размер вашего инсталлятора значение данного параметра повлиять никак не должно, а будут устанавливаться дополнительные файлы или нет, зависит от выбора пользователя, не в зависимости от данного параметра. |
|
Сообщение
#23
|
|
|
Гость_Kindly_*
|
14:04:2005, 11:25
|
|
Инопланетный гость |
Что-то не действует Ваш "красивый" совет по поводу:
Цитата If (FileSearch('my.dll', ExpandConstant('{app}')='') or (FileSearch('my.exe', ExpandConstant('{app}')='') then компилятор выдаёт: "Close round expected." Помогите решить следующую задачу У меня получилось: Цитата procedure CurPageChanged(CurPage: Integer); var s:string; sz:Integer; begin If CurPage=12 then //где CurPage=12 страница с индикатором установки begin If FileSize(ExpandConstant('{app}')+'\#1 DVD Ripper.exe', sz) then begin If sz<>921600 then begin s:='Несоответствие размера файла! Операция отменена!'; MsgBox(s, mbCriticalError, mb_Ok); end; end; end; end; Тут проверка на размер, но после нажатия кнопки "Установить", т.е. перед самим инсталляционным процессом. Показывается окно с индикатором инсталляции и выводится при несоответствии размера сообщение. Кстати в этой процедуре не работает значение Result, оно подбирается автоматически, но установка после нажатия кнопки "OK" всплывающего сообщения на данном примере продолжается. Как сделать так, чтобы при несоответствии размера файла перед появлением соответствующего сообщения инсталлятор вообще досрочно закрывался, т.е. полностью прекращал свою работу, а после полного закрытия выводилось вышеупомянутое сообщение. Если так невозможно, то как сделать так, чтобы инсталлятор полностью закрывался после нажатия кнопки "OK" выводимого сообщения о несоответствии размера? Сделать "аборт", короче говоря |
|
Сообщение
#24
|
|
|
|
14:04:2005, 19:52
|
|
Божественный Группа: Модеры Сообщений: 924 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 16
|
Цитата Что-то не действует Ваш "красивый" совет по поводу: Цитата If (FileSearch('my.dll', ExpandConstant('{app}'='' or (FileSearch('my.exe', ExpandConstant('{app}'='' then компилятор выдаёт: "Close round expected." Важно правильно расставлять символы, в данном случае скобки. Еще раз повторяю код: Цитата Тут проверка на размер, но после нажатия кнопки "Установить", т.е. перед самим инсталляционным процессом. Показывается окно с индикатором инсталляции и выводится при несоответствии размера сообщение. Кстати в этой процедуре не работает значение Result, оно подбирается автоматически, но установка после нажатия кнопки "OK" всплывающего сообщения на данном примере продолжается. Как сделать так, чтобы при несоответствии размера файла перед появлением соответствующего сообщения инсталлятор вообще досрочно закрывался, т.е. полностью прекращал свою работу, а после полного закрытия выводилось вышеупомянутое сообщение. Если так невозможно, то как сделать так, чтобы инсталлятор полностью закрывался после нажатия кнопки "OK" выводимого сообщения о несоответствии размера? Сделать "аборт", короче говоря. Вычитал в хелпе, что это можно сделать через коды выхода инсталлятора, но как? Есть в InnoSetup функция Terminated, но она почему то не работает (у меня 4-ая версия). Насчет кода выхода, они только для того, чтобы знать по какой причине был закрыт инсталлятор, сами коды инсталлятор не закрывают. Вот еще вариант: |