Имя пользователя:
Пароль:
 | Правила  

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
не дружит со свёрнутым деревом компонентов »
Просто свернутые компоненты игнорируются при пересчете итемов компонент-листа, поскольку будучи свернутыми, в качестве компонентов контрола TCheckListBox они перестают существовать.

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

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

Отправлено: 19:26, 21-02-2013 | #1701



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

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


Аватара для Johny777

Ветеран


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

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


Цитата Gnom_aka_Lexander:
качестве компонентов контрола TCheckListBox они перестают существовать »
но не полностью. Какой-то доступ к ним всё же есть. Например можно проверить отмечен тот или иной невидимый айлтем или нет и ещё кое-что:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
ComponentsListTVStyle=yes


[Components]
Name: en; Description: Портативный; Flags: disablenouninstallwarning exclusive collapsed
Name: ru; Description: Локализация; Flags: disablenouninstallwarning exclusive collapsed
Name: ru\8Bit; Description: 8Bit; Flags: exclusive disablenouninstallwarning
Name: ru\Fargus; Description: Fargus; Flags: exclusive disablenouninstallwarning
Name: bs\7Wolf; Description: 7Wolf; Flags: disablenouninstallwarning exclusive


[  code]
procedure InitializeWizard();
begin
  with WizardForm.ComponentsList do
  begin
    MsgBox('ItemsCount:' + #32 + IntToStr(Items.Count), mbInformation, MB_OK);
    if ItemObject[4] <> nil then MsgBox('Exist!', mbInformation, MB_OK);
    if not Checked[2] then MsgBox('Not Checked', mbInformation, MB_OK);
  end;
end;

Отправлено: 19:47, 21-02-2013 | #1702


Аватара для Gnom_aka_Lexander

Ветеран


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

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


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

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


Последний раз редактировалось Gnom_aka_Lexander, 21-02-2013 в 20:12.

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

Отправлено: 19:50, 21-02-2013 | #1703


Ветеран


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

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


у кого-то есть пример чтобы если инсталл уже запущен то 2 раз его нельзя запустить пока не закроется 1?

Отправлено: 23:25, 21-02-2013 | #1704


Аватара для Johny777

Ветеран


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

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


Цитата Gnom_aka_Lexander:
готов спорить, что в этой проверке сам TCheckListBox вообще никак не участвует »
да фиг с ним!

==================================================================================================== =====

Цитата insombia:
у кого-то есть пример чтобы если инсталл уже запущен то 2 раз его нельзя запустить пока не закроется 1? »
1. через создание мьютекса встроенными средствами - CreateMutex(...): http://forum.oszone.net/post-1708051-2236.html

2. через создание семафора - CreateSemaphore(...) :
читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  SYNCHRONIZE = $00100000;
  STANDARD_RIGHTS_REQUIRED = $000F0000;
  SEMAPHORE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3);
  
  SEMAPHORE_UNIQUE_NAME = 'Johny777';
    
    
function CreateSemaphore(lpSemaphoreAttributes, lInitialCount, lMaximumCount: Longint; lpName: String): THandle; external 'CreateSemaphore{#A}@kernel32.dll stdcall';
function OpenSemaphore(dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: String): THandle; external 'OpenSemaphore{#A}@kernel32.dll stdcall';
function ReleaseSemaphore(hSemaphore: THandle; lReleaseCount: Longint; lpPreviousCount: Longint): BOOL; external 'ReleaseSemaphore@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
  hSemaphore: THandle;

function InitializeSetup(): Boolean;
begin
  Result := OpenSemaphore(SEMAPHORE_ALL_ACCESS, False, SEMAPHORE_UNIQUE_NAME) = 0;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
  hSemaphore := CreateSemaphore(0, 1, 1, SEMAPHORE_UNIQUE_NAME);
end;


procedure DeinitializeSetup();
begin
  ReleaseSemaphore(hSemaphore, 1, 0);
  CloseHandle(hSemaphore);
end;

3. добавление строки в глобальный массив записей винды - GlobalAddAtom(...):
читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  ATOM_UNIQUE_NAME = 'Johny777';

type
  ATOM = Word;

function GlobalAddAtom(lpString: String): ATOM; external 'GlobalAddAtom{#A}@kernel32.dll stdcall';
function GlobalFindAtom(lpString: String): ATOM; external 'GlobalFindAtom{#A}@kernel32.dll stdcall';
function GlobalDeleteAtom(nAtom: ATOM): ATOM; external 'GlobalDeleteAtom@kernel32.dll stdcall';


var
  aAtom: ATOM;

function InitializeSetup(): Boolean;
begin
  Result := GlobalFindAtom(ATOM_UNIQUE_NAME) = 0;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
  aAtom := GlobalAddAtom(ATOM_UNIQUE_NAME);
end;


procedure DeinitializeSetup();
begin
  GlobalDeleteAtom(aAtom);
end;

4. через поиск заголовка окна своей программы:
читать дальше »
Код: Выделить весь код
function InitializeSetup(): Boolean;
begin
  Result := FindWindowByWindowName(FmtMessage(SetupMessage(msgSetupWindowTitle), ['{#SetupSetting("AppName")}'])) = 0;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
end;

5. путём сохранения скрытого файла на харде, проверке его наличия и удаления по завершении работы инсталла
читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  FILE_NAME = '\I_am_running';

function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';

var
  LaunchError: Boolean;

function InitializeSetup(): Boolean;
begin
  Result := not FileExists(ExpandConstant('{sd}') + FILE_NAME);
  LaunchError := Result;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
  SaveStringToFile(ExpandConstant('{sd}') + FILE_NAME, '', False);
  SetFileAttributes(ExpandConstant('{sd}') + FILE_NAME, FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;


procedure DeinitializeSetup();
begin
  if LaunchError then DeleteFile(ExpandConstant('{sd}') + FILE_NAME);
end;

6. как и по номеру 5. только сохранять ключ реестра. Извиняй, примера нет, тк с реестром у меня туго

7. Уверен есть ещё способы!
==================================================================================================== =================

Пацаны, подскажите пожалуйста. Хочу сохранять настройки установленной программы в реестре, на данный момент сохраняю в ини, в директории установки.
при повторном запуске гружу настройки из ини. Хочу перейти на реестр, но у меня с ним туго. Вот содержание ини:
Он заполняется единицами при необходимости
читать дальше »
Код: Выделить весь код
procedure CreateInstallINI();
begin
  SaveStringsToFile(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Install.ini'), [
    '[Parameters]',
    'Launch_hl2=',
    'Launch_hl2_ep1=',
    'Launch_hl2_ep2=',
    'Launch_portal=',
    '',
    '[Installed]',
    ';Half-Life 2',
    'hl2=',
    'hl2_ru=',
    'hl2_ru_buka=',
    'hl2_en=',
    'hl2_ru_en=',
    'AuroraB=',
    '',
    ';Half-Life 2 Episode One',
    'ep1=',
    'ep1_ru=',
    'ep1_en=',
    'ep1_ru_en=',
    '',
    ';Half-Life 2 Episode Two',
    'ep2=',
    'ep2_ru=',
    'ep2_en=',
    'ep2_ru_en=',
    '',
    ';Portal',
    'portal=',
    'portal_ru=',
    'portal_en=',
    'portal_ru_en=',
    '',
    ';Common ',
    'Start_Folder_Exist='
  ],False);
end;

мне нужно создать ключ или ключи?
просветите пожалуйста неуча

Последний раз редактировалось Johny777, 22-02-2013 в 13:37. Причина: исправления

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

Отправлено: 04:17, 22-02-2013 | #1705


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Johny777, по вопросу - ты-же сохранил реестр самой игры? Вот по аналогии создавай свой куст в Software и пиши там чего хочешь, главное не забывать убирать за собой. По ответу - 5 и 6 не пойдут, поскольку процедура Deinitializesetup отработает, даже если инсталл не дошел до процедуры InitializeWizard, соответственно повторно запущеный инсталл не запустится, но он уберет ограничитель и будучи запущеным еще раз, будет уже запущен как повторный свободно. Можно конечно, добавить несколько флагов и с их помощью проверять, что именно не дало запустится инсталлятору, но это все костыли. В инно, как я уже писал, специально для этого в секции Setup есть параметры для работы с мьютексом, плюс встроенные функции создания мьютекса из секции кода. Господину insombia просто лень заглянуть в справку, там все это есть. Если никто не обратил внимания, Инсталлятор самого Inno Setup так-же использует мьютекс, пример скрипта лежит в папке установки, если устанавливаете IsPack версию, можно поизучать, если лень головой поработать.

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


Последний раз редактировалось Gnom_aka_Lexander, 22-02-2013 в 09:09.


Отправлено: 09:01, 22-02-2013 | #1706


Аватара для Johny777

Ветеран


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

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


Цитата Gnom_aka_Lexander:
ты-же сохранил реестр самой игры? »
у меня пиратка не ориентируется на язык клиента Стима в реестре. Другие ключи не нужны, те я никакх ключей не сохраняю
Цитата Gnom_aka_Lexander:
Вот по аналогии создавай свой куст в Software и пиши там чего хочешь »
а как насчёт ключа удаления куда инно пишет все свои данные: путь к деинсталятору, выбранные компонент, язык и пр.
Мне можно создать создать там запись? Ведь это удобно, тк при полном удалении она, инно, и мои ключи потрёт
Если да то мне создавать там куст или ключ?
Можно ли сохранить весь ини с его структурой в реестре в одной записи?
Это удобно, тк я заргузил бы его немного изменённой функцией El Sanchez-а и прочитал бы как ини и не нужно код переписывать?


Цитата Gnom_aka_Lexander:
5 и 6 не пойдут, поскольку процедура Deinitializesetup отработает »
исправил в пред. сообщении. Хватило одной булев переменной

Отправлено: 13:46, 22-02-2013 | #1707


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
Хватило одной булев переменной »
Отнюдь. Отрицательный результат функции InitializeSetup может зависеть не только от наличия контрольного файла - записи. может быть целая куча вариантов.
По реестру:
читать дальше »
// Registry functions
// проверка
function RegKeyExists(const RootKey: Integer; const SubKeyName: String): Boolean;
function RegValueExists(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
// чтение массива
function RegGetSubkeyNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
function RegGetValueNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
// чтение
function RegQueryStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultDWord: Cardinal): Boolean;
function RegQueryBinaryValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: AnsiString): Boolean;
// запись
function RegWriteStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteExpandStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; const Data: Cardinal): Boolean;
function RegWriteBinaryValue(const RootKey: Integer; const SubKeyName, ValueName, Data: AnsiString): Boolean;
// удаление
function RegDeleteKeyIncludingSubkeys(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteKeyIfEmpty(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteValue(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;

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


Последний раз редактировалось Gnom_aka_Lexander, 22-02-2013 в 14:26.


Отправлено: 13:50, 22-02-2013 | #1708


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

Ветеран


Contributor


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

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


Цитата Johny777:
Хочу сохранять настройки установленной программы в реестре, на данный момент сохраняю в ини, в директории установки.
при повторном запуске гружу настройки из ини. Хочу перейти на реестр, но у меня с ним туго. »
Johny777, используй RegisterPreviousData, GetPreviousData, SetPreviousData для регистрации своих настроек в реестре.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:01, 22-02-2013 | #1709


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


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

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


Вложения
Тип файла: rar Metro.rar
(6.4 Kb, 14 просмотров)

вот такая проблемка - как в этом скрипте убрать страницу выбора компонентов ?
на нем я по тихоньку на досуге учусь,если что

Последний раз редактировалось tsskz, 23-02-2013 в 13:47.


Отправлено: 12:25, 23-02-2013 | #1710



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход