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

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

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

Аватара для 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] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Отправлено: 19:06, 28-03-2013

 

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


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

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


Приветствую!
Подскажите, можно ли создать страницу в инсталляторе, чтобы она отображалась после распаковки приложения?
Я сделал как в help, но не знаю как ее отобразить после распаковки

DBPage := CreateInputQueryPage(wpReady,
'Информация для соединения с базой данных MySQL', '',
'Введите данные для соединения с сервером и нажмите далее.');

Конечная цель - это распаковать программу, на странице DBPage попросить пользователя ввести данные для подключения к MySQL, далее занести эти данные в ini файл и проверить соединение с базой MySQL по введенным данным. И второй вопрос, как можно осуществить проверку успешного соединения с базой?

Отправлено: 13:12, 31-08-2013 | #1081



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

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


Ветеран


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

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


laboart, кастомная страницы после страницы прогресса установки:
Код: Выделить весь код
DBPage := CreateInputQueryPage(wpInstalling, 'Информация для соединения с базой данных MySQL', '', 'Введите данные для соединения с сервером и нажмите далее.');

Отправлено: 20:01, 31-08-2013 | #1082


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


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

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


R.i.m.s.k.y., спасибо, экая я невнимательная
Вопрос появился. На этапе инсталляции пользователь вводит какие-то значения, которые дальше используются (с помощью Scripted Constants). Можно ли до этих значений (конкретно тех, что ввел пользователь) доступиться при деинсталляции?

Отправлено: 17:47, 02-09-2013 | #1083


Аватара для Johny777

Ветеран


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

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


Shkutu,

данные лучше хранить в реестре, понятное дело к ним есть доступ пока есть ключ.

как "На этапе инсталляции пользователь вводит какие-то значения"?
можешь показать код?
тогда может смогу написать соответствующий пример

Данные должны сохраняться сразу после ввода?

вот небольшой пример работы с реестром на чистом WinApi http://forum.oszone.net/post-2201802.html#post2201802
если тебе его не хватит, то скажи. Попробую сделать

Последний раз редактировалось Johny777, 03-09-2013 в 15:06.


Отправлено: 14:59, 03-09-2013 | #1084


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


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

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


Johny777, ввод значений так:
[code]
Код: Выделить весь код
procedure AskInstanceName();
begin
 Instancepage:= CreateInputQueryPage(wpSelectComponents,
  ExpandConstant('{cm:InstName}'), ExpandConstant('{cm:InstFolderName}'),
  ExpandConstant('{cm:ChooseInstFolderName}'));
  Instancepage.Add(ExpandConstant('{cm:InstName}'), false);
  if ActiveLanguage = 'russian' then 
    Instancepage.Values[0]:= ExpandConstant('{#InstanceNameRus}')
  else Instancepage.Values[0]:= ExpandConstant('{#InstanceName}');
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var b: boolean;
    path:string;
    RunModeIdx:integer;
begin
 if (CurPageID=Instancepage.ID) then
  begin
  if ((RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\UCS\instances\' + Instancepage.Values[0]))
    and (DirExists(ExpandConstant('{app}')+'\UCS\'+Instancepage.Values[0]+'\Rk7Reference')))
  then
  begin 
    MsgBox(ExpandConstant('{cm:InstNameErr}'), mbInformation, MB_OK);
    result:=false;
  end
  else
   begin
    Instancename:= Instancepage.Values[0];
    path:=ExpandConstant('{app}\UCS\')+Instancename+'\Rk7Reference\';    
    //b:=ForceDirectories(path);
    RefBasePath :=path+'base';      
    BasePathPage.Values[0] := RefBasePath;
    result:=true;
   end;     
  end
...
end;

function GetInstancename(param:string):string; 
begin
 if Instancename='' then 
  if ActiveLanguage = 'russian' then 
    Instancename:= ExpandConstant('{#InstanceNameRus}')
  else Instancename:= ExpandConstant('{#InstanceName}');
 result:=Instancename;
end;
Данные не просто сохраняются после ввода, а используются при установке в именах папок, ини файлах и т д
С реестром не получится, т к значения в него пишутся тоже с учетом того, что ввел пользователь, т е
Код: Выделить весь код
[Registry]
Root: "HKLM"; Subkey: "Software\UCS\instances\{code:GetInstanceName}"; ValueType: string; ValueName: "path"; ValueData: "{app}\UCS\{code:GetInstanceName}"
Вот и получается, что на момент деинсталляции не понятно (мне, по крайней мере), как доступиться до нужных данных, чтобы как раз удалить ненужные ключи реестра и ini файлы.

UPD. И еще нет ли какого-нибудь примера про то, как можно добавить форму к деинсталлятору (в InitializeUninstallProgressForm наверное)? А то у меня что-то толком не получается это сделать, а примеров на эту тему вообще не нашла (

Последний раз редактировалось Shkutu, 03-09-2013 в 18:38. Причина: доп. вопрос


Отправлено: 15:33, 03-09-2013 | #1085


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

Ветеран


Contributor


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

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


Цитата Shkutu:
С реестром не получится, т к значения в него пишутся тоже с учетом того, что ввел пользователь »
Shkutu, вы в реестр пишете свои данные не для мусора ради, а чтобы эти данные потом использовать. При деинсталляции вызывайте функцию RegGetSubkeyName, чтобы получить массив всех instances, потом в цикле перебираете и делаете черные дела.

Отправлено: 19:24, 03-09-2013 | #1086


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


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

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


Цитата El Sanchez:
реестр пишете свои данные не для мусора ради »
Естественно, чтобы использовать - лицензии проверять например.
Цитата El Sanchez:
цикле перебираете »
Мне же не все инстансы (которых может быть целая куча) удалять надо, а какой-то конкретный. Собственно вопрос как раз в том, как этот самый конкретный определить.

Отправлено: 19:42, 03-09-2013 | #1087


Аватара для Johny777

Ветеран


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

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


Shkutu,
Цитата Shkutu:
а какой-то конкретный »
просто сохраняй имя инстансы в директории установки в текстовом файле, и когда надо считывай из него текст. В качестве защиты от дурака скрой его
вот накатал функции сохранения текста в файле и чтения оттуда. Они на чистом WinApi
читать дальше »
Код: Выделить весь код
#define A = (Defined UNICODE) ? "W" : "A"

const
    OPEN_ALWAYS = 4;
    GENERIC_READ = $80000000;
    GENERIC_WRITE = $40000000;
    FILE_SHARE_READ = $00000001;
    FILE_SHARE_WRITE = $00000002;
    OPEN_EXISTING = 3;
    TRUNCATE_EXISTING = 5;
    
    INVALID_HANDLE_VALUE = -1;
    
    OFS_MAXPATHNAME = 128;

type
    Pointer = Longint;
    POverlapped = Pointer;
    PSecurityAttributes = Pointer;


function CreateFile(lpFileName: String; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition,
  dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@Kernel32.dll stdcall';
  
function WriteFile(hFile: THandle; const Buffer: Pointer; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD;
  lpOverlapped: POverlapped): BOOL; external 'WriteFile@Kernel32.dll stdcall';
  
function ReadFile(hFile: THandle; Buffer: Pointer; nNumberOfBytesToRead: DWORD;
  var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; external 'ReadFile@Kernel32.dll stdcall';
  
function GetFileSize(hFile: THandle; lpFileSizeHigh: Pointer): DWORD; external 'GetFileSize@Kernel32.dll stdcall';
  
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';




function GetTextFromFile(const FileName: String; out Text: String): Boolean;
var
    dwBytesRead: DWORD;
    FileSize: DWORD;
    hFile: THandle;
begin
    hFile := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    Result := hFile <> INVALID_HANDLE_VALUE;
    if Result then
    try
        FileSize := GetFileSize(hFile, 0);
        SetLength(Text, FileSize);
        Result := ReadFile(hFile, CastStringToInteger(Text), FileSize, dwBytesRead, 0);
    finally
        CloseHandle(hFile);
    end;
end;


function SaveTextToFile(const FileName, Text: String): Boolean;
var
    dwByteWritten: DWORD;
    hFile: THandle;
begin
    hFile := CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS or TRUNCATE_EXISTING, 0, 0);
    Result := hFile <> INVALID_HANDLE_VALUE;
    if Result then
    try
        Result := WriteFile(hFile, CastStringToInteger(Text), Length(Text), dwByteWritten, 0);
    finally
        CloseHandle(hFile);
    end;
end;



procedure InitializeWizard();
var
    S: String;
begin
    if SaveTextToFile('C:\file.txt', 'Shkutu') then
    if GetTextFromFile('C:\file.txt', S) then
      MsgBox(S, mbInformation, MB_OK);
end;

у меня нет доверия к встроенным
SaveString(s)ToFile
LoadString(s)FromFile
но если хочешь воспользуйся ими

или пиши своё собственное значение в реестр с именем инстансы только для самой себя, и читай её в деинсталяторе

Цитата Shkutu:
как можно добавить форму к деинсталлятору »
объясни лучше на словах как оно должно выглядеть. Может не форму а страницу типа той которую ты создаёшь у себя в коде?
А то я честно говоря не знаю что мне писать

El Sanchez, раз уж ты здесь можешь пожалуйста проверить правильность моих функций SaveTextToFile и GetTextFromFile. Как бы я с флагами не напутал, хотя всё работает, но фиг знает

Последний раз редактировалось Johny777, 03-09-2013 в 23:00. Причина: Улучшил. Теперь при записи текста длиной короче, что есть в файле нет куска пред. текста на конце нового (TRUNCATE_EXISTING)

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

Отправлено: 20:22, 03-09-2013 | #1088


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

Ветеран


Contributor


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

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


Цитата Shkutu:
а какой-то конкретный »
Shkutu, какой? У вас в распоряжении полный список instances, не знаете какой выбрать? Кстати, где лежит деинсталлятор?

Цитата Johny777:
правильность моих функций SaveTextToFile и GetTextFromFile. Как бы я с флагами не напутал, хотя всё работает, но фиг знает »
Johny777, сойдет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:54, 03-09-2013 | #1089


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


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

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


El Sanchez, да, полный список инстансов вытащить из реестра можно при желании, но вот выбрать конкретный действительно не могу.
Цитата El Sanchez:
Кстати, где лежит деинсталлятор? »
Деинсталлятор кладу в ту же папку, куда устанавливается экземпляр программы. Думала, что с этим учетом получится вытащить хотя бы имя папки с помощью GetCurrentDir, но он почему-то вернул C:\Windows\System32.
Цитата Johny777:
просто сохраняй имя инстансы в директории установки в текстовом файле, »
Эта идея тоже в голову приходила. Но если есть директория, то имя инстанса я и так могу вытащить (из реестра например). Но инстансов может быть сколько угодно и ставится они могу куда угодно, причем имя папки установки получается с учетом имени пользователя (такой вот извращенный способ, но идея не моя), поэтому вытащить нужный файлик тоже не получается.
Цитата Johny777:
словах как оно должно выглядеть. Может не форму а страницу »
Просто подумала, что можно сделать типа универсальный инсталлятор, чтобы пользователь сам выбирал имя инстанса - раз уж у меня не получается его вытащить. Так что выглядеть это должно как форма с выпадающим списком инстансов, например. Насчет страницы - можно было бы. Но разве можно создавать такую для деинсталлятора? Там же указывается ид страницы, после которой кастомная страница должна идти, а у деинсталлятора никаких страниц нет.

Отправлено: 12:36, 04-09-2013 | #1090



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты 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




 
Переход