Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Написание скрипта для инсталлятора
Гость_Kindly_*
сообщение 17:03:2005, 16:05
Цитата Ответить 





Инопланетный гость






    


(Вопрос по Inno Setup 5) Я извиняюсь за вопрос немножко не в тему. Меня интереcует написание скрипта на Pascal следующего характера: Перед запуском инсталлятора нужна проверка реестра на определённый ключ, и если он существует - должен запускаться мастер инсталляции, а если ключ не существует, то должна вылетать мессага, что прога не найдена - жмите OK чтобы покинуть мастер (ну или другой текст). Вобщем вы программеры - для вас скриптик или только секцию кода написать не составит труда. Поможете такому как мне?
mailto:gubei_vadim@list.ru
Подняться вверх 
 
Сообщение #1
10 страниц V   1 2 3 > »   
Новая тема 
Ответов (1 - 29)
zubr
Вставить ник
сообщение 17:03:2005, 16:18
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 924
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Пример проверки инсталлятором установлена ли в системе Delphi, если нет, то инсталляция завершается:
function InitializeSetup(): Boolean;
begin
Result:=True;
If (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\5.0')) and
 (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\6.0')) and
 (not RegKeyExists(HKLM, 'SOFTWARE\Borland\Delphi\7.0')) then
begin
 MsgBox('Not found Delphi on our computer', mbError, mb_Ok);
 Result:=False;
end;
end;
Подняться вверх 
 
Сообщение #2
Гость_Kindly_*
сообщение 19:03:2005, 13:46
Цитата Ответить 





Инопланетный гость






    


zubr, спасибо огромноеtongue.gif. Классно у Вас, программеров, всё получается! Может покажусь слишком наглым, но позвольте спросить ещё про одну фичу...
Например, я создал русификатор, который поместил в инсталлятор (Inno Setup 5). Проверка на ключ прошла успешно, путь установки также взят из реестра - жмём "Установить"///
Вопрос следующий: имеется ли возможность у самого инсталлятора проверять наличие определённого файла в папке назначения после нажатия кнопки "Установить". Например, если файл отсутствует (который должен проверяться) - должно появиться сообшение "Выбрана неверная папка!" (или т.п.). Если не трудно, опишите это, пожалуйста, на примере - этим Вы поможете многим локализаторам софта.
Ну, и чтобы лишний раз не постить, спрошу; если вышеописанная функция возможна, то возможна ли проверка требуемого файла (в папке назначения) на такие атрибуты как размер и CRC сумма?
Подняться вверх 
 
Сообщение #3
zubr
Вставить ник
сообщение 19:03:2005, 19:51
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 924
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Вопрос следующий: имеется ли возможность у самого инсталлятора проверять наличие определённого файла в папке назначения после нажатия кнопки "Установить". Например, если файл отсутствует (который должен проверяться) - должно появиться сообшение "Выбрана неверная папка!" (или т.п.).

Такая возможность есть. Вот пример кода, где имя файла www.sss:
[Code]

function NextButtonClick(CurPage: Integer): Boolean;
var
 s:string;
begin
Result:=True;
If CurPage=5 then
begin
 If FileSearch('www.sss', ExpandConstant('{app}'))='' then
 begin
  s:='В каталоге '+ExpandConstant('{app}')+' файл www.sss отсутствует!';
  MsgBox(s, mbError, mb_Ok);
  Result:=False;
 end;
end;
end;

Здесь CurPage=5. Определить CurPage можно в отладке. Запускаешь процесс инсталляции в InnoSetup клавишей F7, когда шаг доходит до строки CurPage, наводишь на нее курсор, всплывающая подсказка покажет значение CurPage.
Цитата
если вышеописанная функция возможна, то возможна ли проверка требуемого файла (в папке назначения) на такие атрибуты как размер и CRC сумма?

В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться.
Подняться вверх 
 
Сообщение #4
Гость_Kindly_*
сообщение 20:03:2005, 08:57
Цитата Ответить 





Инопланетный гость






    


Цитата
В самом InnoSetup это невозможно, но можно сделать программку, которая будет находиться в дистрибутиве и при установке запускаться программой установки, выполнив соответствующие проверки, удаляться.

В смысле, внешняя программка сначала будет загружаться и, обнаружив файл, проверит, например, CRC сумму и выдаст сообщение, например "У вас программа соответствующей версии. Запустить мастер установки?"
Или эта программка будет вызываться инсталлятором для проверки непосредственно перед самим процессом инстялляции, и после проверки будет ли программка посылать ответ инталлятору, который будет принимать соответствующие дейтвия?
zubr Вы из Беларуси? Я - да. Вы уже в курсе дела, может договоримся о написании Вами этой программки?
Подняться вверх 
 
Сообщение #5
zubr
Вставить ник
сообщение 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
zubr
Вставить ник
сообщение 21:03:2005, 07:55
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 924
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Цитата
Как сделать чтобы при перезаписи оригинальных файлов создавались их резервные копии (у меня получались резервные копии тех файлов, которые были в инсталляторе).

Опять таки искать файл и если он есть, создать папку "backup", к примеру, в том же каталоге куда устанавливается программа, и скопировать файл в "backup". Все это можно сделать средствами InnoSetup.
Цитата
И возможно ли сделать так, чтобы пользователю предоставлялась возможность в самом инсталляторе предварительно отметить/поставить галочку на это действие (на подобии как в патчере-инсталляторе PatchWise Free)?

Можно через компоненты.
У меня на работе под рукой Inno Setup нет, подробнее смогу, если время будет вечером.
Подняться вверх 
 
Сообщение #8
zubr
Вставить ник
сообщение 21:03:2005, 20:25
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 924
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


[Components]
Name: "Backup"; Description: "Backup"; Types: full

[Files]
Components: Backup; Source: "MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: MyProgCheck

[Code]

function MyProgCheck():boolean;
var
   s1, s2:string;
begin
Result:=True;
s1:=ExpandConstant('{app}')+'\MyProg.exe';
s2:=ExpandConstant('{app}')+'\Backup';
If FileExists(s1) then
begin
 CreateDir(s2);
 FileCopy(s1, s2+'\MyProg.exe', False);
end;
end;

Здесь файл MyProg.exe и есть с которого делается копия.
Подняться вверх 
 
Сообщение #9
Гость_Kindly_*
сообщение 6:04:2005, 07:03
Цитата Ответить 





Инопланетный гость






    


Долго не имел возможности ответить, поэтому сейчас выражаю безразмерную благодарность за оказанную Вами, zubr, помощь. Что касается "окончательного" вопроса, так он состоит в следующем:
Можно ли в Inno Setup произвести деинсталляцию так, чтобы при удалении установленных файлов, при предварительном создании резервных копий перезаписываемых файлов, резервные файлы восстанавливались на свои прежние места, а сама папка (резервных файлов) удалялась?
Подняться вверх 
 
Сообщение #10
zubr
Вставить ник
сообщение 6:04:2005, 15:58
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 924
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Чисто средствами Inno Setup такое не получится. Это надо будет делать свой UnInstall.exe, а в проекте Inno Setup сделать следующее:
[Files]
Source: "MyProg.exe"; Flags: onlyifdoesntexist uninsneveruninstall
Source: "UnInstall.exe"

[UninstallRun]
Filename: "{app}\UnInstall.exe"
Подняться вверх 
 
Сообщение #11
Гость_Kindly_*
сообщение 7:04:2005, 08:26
Цитата Ответить 





Инопланетный гость






    


Спасибо большое! Благодаря Вам я узнал всё то, что меня интересовало по данной теме. Хорошо хоть "земляки" откликнулись, а то на российских форумах молчат =).
Подняться вверх 
 
Сообщение #12
zubr
Вставить ник
сообщение 7:04:2005, 15:32
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 924
Регистрация: 19:11:2003
Пользователь №: 133



Репутация:   16  


Рад был помочь rolleyes.gif
Подняться вверх 
 
Сообщение #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
zubr
Вставить ник
сообщение 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.
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
sz:Integer;
begin
Result:=True;
If CurPage=5 then
begin
If FileSearch('www.sss', ExpandConstant('{app}'))='' then
begin
   s:='В каталоге '+ExpandConstant('{app}')+' файл www.sss отсутствует!';
 MsgBox(s, mbError, mb_Ok);
 Result:=False;
end
else
begin
 If FileSize(ExpandConstant('{app}')+'\www.sss',  sz) then
 begin
  If sz<>2840 then//2840 - проверяемый размер
  begin
   s:='Файл www.sss несоответствует!';
   MsgBox(s, mbError, mb_Ok);
   Result:=False;
  end;
 end;
end;
end;
end;
Подняться вверх 
 
Сообщение #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
zubr
Вставить ник
сообщение 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' будет игнорироваться. Как правильно вклеить мессагу так, чтобы все проверки совершались правильно и чтобы после удачных проверок не вылетало "лишнего" сообщения? В чём недочёт или ошибка?

Здесь можно сделать так:
function NextButtonClick(CurPage: Integer): Boolean;
var
 s:string;
begin
Result:=True;
If CurPage=6 then
begin
If (FileSearch('my.dll', ExpandConstant('{app}')='') or (FileSearch('my.exe', ExpandConstant('{app}')='') then
begin
 s:='Выбрана неверная папка!';
 MsgBox(s, mbCriticalError, mb_Ok);
 Result:=False;
end;
end;
end;
Подняться вверх 
 
Сообщение #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
zubr
Вставить ник
сообщение 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;



Это ж можно проверить абсолютно все файлы!

Все таки красивее будет мой вариант:
If (FileSearch('my.dll', ExpandConstant('{app}')='') or (FileSearch('my.exe', ExpandConstant('{app}')='') then

Для следующего файла добавляете 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;

Ну здесь, во первых, надо добавить
If CurPage=6 then

иначе проверка на размер файла будет проводиться на всех шагах установки, что может вызвать исключительную ситуацию.
Чтобы дальше установка не продолжалась, если проверка не прошла делаете так:
If sz<>921600  then
begin
 s:='Несоответствие размера файла! Обновляемый файл изменён или имеет другую версию. Операция отменена!';
 MsgBox(s, mbCriticalError, mb_Ok);
Result:=False;
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
zubr
Вставить ник
сообщение 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" выводимого сообщения о несоответствии размера? Сделать "аборт", короче говоряsmile.gif. Вычитал в хелпе, что это можно сделать через коды выхода инсталлятора, но как?
Подняться вверх 
 
Сообщение #24
zubr
Вставить ник
сообщение 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."

Важно правильно расставлять символы, в данном случае скобки. Еще раз повторяю код:
If (FileSearch('my.dll', ExpandConstant('{app}'))='') or (FileSearch('my.exe', ExpandConstant('{app}'))='') then

Цитата
Тут проверка на размер, но после нажатия кнопки "Установить", т.е. перед самим инсталляционным процессом. Показывается окно с индикатором инсталляции и выводится при несоответствии размера сообщение. Кстати в этой процедуре не работает значение Result, оно подбирается автоматически, но установка после нажатия кнопки "OK" всплывающего сообщения на данном примере продолжается. Как сделать так, чтобы при несоответствии размера файла перед появлением соответствующего сообщения инсталлятор вообще досрочно закрывался, т.е. полностью прекращал свою работу, а после полного закрытия выводилось вышеупомянутое сообщение. Если так невозможно, то как сделать так, чтобы инсталлятор полностью закрывался после нажатия кнопки "OK" выводимого сообщения о несоответствии размера? Сделать "аборт", короче говоря. Вычитал в хелпе, что это можно сделать через коды выхода инсталлятора, но как?

Есть в InnoSetup функция Terminated, но она почему то не работает (у меня 4-ая версия). Насчет кода выхода, они только для того, чтобы знать по какой причине был закрыт инсталлятор, сами коды инсталлятор не закрывают. Вот еще вариант:
If FileSize(ExpandConstant('{app}')+'\#1 DVD Ripper.exe',  sz) then
begin
If sz<>921600  then
begin
  s:='Несоответствие размера файла!';
  MsgBox(s, mbError, mb_Ok);
  WizardForm.Close;
  Result:=False;