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

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

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

Аватара для El Sanchez

Ветеран


Contributor


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


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

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


Изменения
Автор: Vadikan
Дата: 22-05-2012
Описание: Закрыто
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


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

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

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

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

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

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


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]


Продолжение обсуждения
Скрипты Inno Setup. Помощь и советы [часть 5]

Отправлено: 18:01, 29-08-2011

 

Аватара для Gnom_aka_Lexander

Ветеран


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

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


alert30,
Цитата Лександер:
при ошибках - скрин ошибки и строчки, на которую ругнулось. »
Писать - лучше в компиляторе, всякие IDE-редакторы - хороши для заполнения дефолтных секций, до ума ни один не был доведен до сих пор.
Цитата alert30:
установлено InnoUltra »
Мне это ни очем не говорит. InnoUltra - это всего лишь удобный для установки набор инструментов, я не знаю, какая версия компилятора стоит у тебя - там все 4 версии заложены.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 20:39, 31-12-2011 | #531



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

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


Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата TROY Diamond:
Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками »
TROY Diamond, искать надо по значению ключа DisplayName. Пример (ищем Inno Setup QuickStart Pack, чтобы удалить):
читать дальше »

Код: Выделить весь код
[code]
function argv(Param: String): TArrayOfString;
begin
    SetArrayLength(Result, 2);
    case Param[1] of
        '"': begin
            Result[0] := Copy(Param, 2, Pos('.exe', Lowercase(Param))+2);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+3, Length(Param))));
        end;
    else
        begin
            Result[0] := Copy(Param, 1, Pos('.exe', Lowercase(Param))+3);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+1, Length(Param))));
        end;
    end;
end;


function GetInstalledProgramm(Param: String): Boolean;
var
    Names, cl: TArrayOfString;
    i, ResultCode: Integer;
    DisplayName, UninstallString: String;
begin
    if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', Names) then for i := 0 to GetArrayLength(Names)-1 do
    begin
        RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'DisplayName', DisplayName);
        if Pos(Lowercase(Param), Lowercase(DisplayName)) > 0 then
        begin
            Result := True;
            if MsgBox('Программа установки обнаружила уже установленную программу ' + DisplayName + '.'#13#10'Вы желаете предварительно удалить ее?', mbInformation, MB_YESNO) = idYes then
            begin
                if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'UninstallString', UninstallString) then
                begin
                    cl := argv(UninstallString);
                    if not Exec(cl[0], cl[1], '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
                        MsgBox('Ошибка удаления.'#13#10'' + SysErrorMessage(ResultCode) + '.'#13#10'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
                end;
            end;
            Break;
        end;
    end;
end;


procedure InitializeWizard();
begin
    GetInstalledProgramm('Inno Setup QuickStart Pack');
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:11, 01-01-2012 | #532


Пользователь


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

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


Цитата Serega:
Стандартными методами нет, можно перехватывать это сообщение и нажимать автоматом на кнопку, но всё равно само сообщение будет видно.
Как подскажите, пожалуйста!!! Пускай, хоть как, главное, чтобы табличка со стандартным предупреждением о нехватке места НЕ "висела" и пользователь НЕ нажал, НЕ успел нажать "Нет"!!!
А то получается я пишу через код, что к примеру требуется 8 ГБ, а потом вылезает табличка, что места не хватает и нужно гигов 15... Что пользователь подумает?


Цитата:
Код рабочий, только не совсем понятно, зачем удалять сохранения из {app}, если всё равно её удалять будете или у вас {app} остаётся после деинсталляции?
Рабочий? Но никаких сообщений НЕ появляется и сохранения НЕ удаляются!!! Где бы они не находились хоть в корне диска... {sd}, {userdocs}, разные ставил... Папка установки удаляется полностью если в в ней ничего нет, а там остаются сохранения, если пользователь хочет удалить сохранения, тогда удаляется вся папка, а если нет?
Иначе бы использовал бы [UninstallDelete].

Отправлено: 01:16, 01-01-2012 | #533


Пользователь


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

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


1. Мне нужно наложить картинку на все диалоговые окна инсталлятора, КРОМЕ ПЕРВОЙ И ПОСЛЕДНЕЙ. А здесь есть на все окна... и только на первую и последнюю.

2. Как создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра, никаких "Section", "InstallPath", НЕ надо!
Только одно значение БЕЗ всего - в одну строчку, без кавычек, тире, двоеточий, типа открыл это файл, а там только:

htuifgvifgj4575489jgfkgfmgf765авроршгщ

и всё больше ничего нет!


3. Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками.

Вот с этим вариантом можно что-нибудь сделать:


Код: Выделить весь код
var
  AppDir, unins, run: string;
  ResultCode: Integer;
  UninsButton, RunButton: TButton;
  MyLabel: TLabel;

procedure ReadEntries;
begin
	RegQueryStringValue(HKLM, 'SOFTWARE\My Prog', 'Path', AppDir);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  ReadEntries;
  if (RegValueExists(HKLM, 'SOFTWARE\My Prog'', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\My Program.exe')) then
  Confirm:= False else
  Confirm:= True;
end;

procedure Uninstall(Sender: TObject);
begin
  unins:='unins000.exe';
  ReadEntries;
  if not (FileExists(AddBackslash(AppDir) + unins)) then
    MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('My Prog'') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
  else
    Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
  WizardForm.Close;
end;

procedure RunProgramm(Sender: TObject);
begin
  run:='My Program.exe';
  ReadEntries;
  if (FileExists(AddBackslash(AppDir) + run)) then
    Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
  WizardForm.Close;
end;

procedure NewForm;
begin
  ReadEntries;
  if (RegValueExists(HKLM, 'SOFTWARE\My Prog'', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\My Program.exe')) then begin
  with WizardForm do
  begin
    ClientWidth := ScaleX(395);
    ClientHeight := ScaleY(120);
    Bevel.Hide;
    InnerNotebook.Hide;
    OuterNotebook.Hide;
    BorderStyle:= bsDialog;
    Center;
    with CancelButton do
    begin
      Left := WizardForm.CancelButton.Left -100;
      Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
      BringToFront;
    end;
    UninsButton:= TButton.Create(WizardForm);
    with UninsButton do
    begin
      Left := WizardForm.NextButton.Left -100;
      Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
      Width:= WizardForm.NextButton.Width;
      Parent:= WizardForm;
      Caption:= 'Удалить';
      OnClick := @Uninstall;
      BringToFront;
    end;
    RunButton:= TButton.Create(WizardForm);
    with RunButton do
    begin
      Left := WizardForm.BackButton.Left -110;
      Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
      Width:= WizardForm.BackButton.Width;
      Parent:= WizardForm;
      Caption:= 'Запустить';
      OnClick := @RunProgramm;
      BringToFront;
    end;
    MyLabel:= TLabel.Create(WizardForm);
    with MyLabel do
    begin
      SetBounds(10,10,380,80);
      AutoSize:=False;
      WordWrap:=True;
      Font.Color:=$000000;
      Font.Style:=[fsBold];
      Font.Size:=10;
      Parent:=WizardForm;
      Transparent:=True;
      Caption:= 'Программа ' + ExpandConstant('«My Prog'»') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
      end;
    end;
  end;
end;

procedure InitializeWizard;
begin
  NewForm;
end;
ТОЛЬКО ЗДЕСЬ НЕМНОГО НЕ ТАК!!! Надо, чтобы у пользователя была возможность продолжить установку, вдруг деинсталлятора НЕТ, или чё-нибудь НЕ работает, - часто пользователя "вручную" удаляют приложение, БЕЗ деинсталлятора, а ключ в реестре так и весит и ни чё не сделаешь!

4. Мне нужно как в этом коде, только "универсально", чтобы "всем подходило":

Код: Выделить весь код
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Prog_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox('Эта программа уже была ранее установлена.' #13#13 'Вы хотите предварительно удалить её?', mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещён, удалён или переименован.', mbError, MB_OK);
end;
end;
end;
end;
5. Так как всё-таки "убить процесс" во время установки?!

Как из секции [code] запустить приложение, файл, батник и т.п. в тихом режиме, БЕЗ запроса, с правами Администратора и с "мнгновенным" удалением сразу же после того как действие будет выполнено?

Отправлено: 02:42, 01-01-2012 | #534


Ветеран


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

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


Всех с наступившим Новым Годом!
Подскажите пожалкуйста.
При указывании AppId:
Код: Выделить весь код
#define AppId "Программа"
запись в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall выглядит так:
Код: Выделить весь код
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Программа_is1
Можно ли как-то избавиться от этого _is1? Чтоб было как в AppId-Программа?

Последний раз редактировалось МИШАНЧИК, 02-01-2012 в 03:47.


Отправлено: 04:42, 01-01-2012 | #535


Аватара для dracosha

Пользователь


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

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


Цитата МИШАНЧИК:
Можно ли как-то избавиться от этого _is1? »
От этого не избавиться... Сам буквально на днях задавался этим вопросом. Это "клеймо" в самом inno прошито.

Отправлено: 13:52, 02-01-2012 | #536


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

Ветеран


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

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


МИШАНЧИК, dracosha, это клеймо сделано специально. Если будет установлена другая программа с тем же AppId, в этом случае клеймо станет _is2

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

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

Отправлено: 18:41, 02-01-2012 | #537


Аватара для kangreon

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


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

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


Доброго времени суток. Помогите, пожадуйста разобраться в проблеме.
Собственно стоит задача, во время удаления программы, спросить у пользователя разрешения на удаление некоторых файлов. Для этого я в секции [UninstallDelete] добавил строчку такого содержания:

Код: Выделить весь код
Type: filesandordirs; Name: "{app}\Data\"; Check: isDeleteSetting
где функция isDeleteSetting выглядит так:

Код: Выделить весь код
function isDeleteSetting: Boolean;
begin
  Result := MsgBox('Удалить настройки программы?', mbConfirmation, MB_YESNO) = IDYES;
end;
Проблема в том, что если строчка Check: isDeleteSetting присутствует, то данный код выполняется во время УТАНОВКИ программы, а не во время удаления. Без Check: isDeleteSetting все работает правильно, но, естественно, без какого-либо вопроса.

Как можно исправить эту проблему?

Версия Inno Setup: 5.4.3
Полный код примера: http://pastebin.com/XKvSLsdc

Отправлено: 19:05, 02-01-2012 | #538


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

Ветеран


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

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


kangreon,
наверное так:
Код: Выделить весь код
[*C*ode]
var isUninst : string;

function InitializeUninstall(): Boolean;
begin
isUninst := 'isUninst';  
result := true;
end;

function isDeleteSetting: Boolean;
begin
Result := False;
if isUninst = 'isUninst' then if (MsgBox('Удалить настройки программы?', mbConfirmation, MB_YESNO) = IDYES) then Result := True;
end;
Но проверенный способ вот такой безо всяких [UninstallDelete]:
Код: Выделить весь код
[*C*ode]
procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then begin
  if DirExists(ExpandConstant('{app}\Data')) then begin
    if MsgBox('Удалить настройки?',mbconfirmation, mb_yesno) = IDYES then RD(ExpandConstant('{app}\Data'))
  end;
end;

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


Последний раз редактировалось R.i.m.s.k.y., 02-01-2012 в 19:45.

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

Отправлено: 19:21, 02-01-2012 | #539


Аватара для kangreon

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


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

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


R.i.m.s.k.y., Спасибо за подсказку. Сейчас попробую Ваш код.

Добавление проверки в мой изначальный код не помогло. Проблема остается. Функция isDeleteSetting не вызывается во время процесса удаления. Возможно это баг компилятора...

Отправлено: 19:35, 02-01-2012 | #540



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Test ferget Тест-форум 0 24-08-2011 01:25
test ! ! Aaa ! ! Тест-форум 0 23-04-2011 11:29
test Santa aka Snt Тест-форум 0 16-04-2011 22:35
test xolod. Программное обеспечение Linux и FreeBSD 0 19-04-2009 21:03
Test memory KEugeNik Хочу все знать 11 23-11-2003 23:11




 
Переход