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

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

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

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

Ветеран


Contributor


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


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

Профиль | Отправить 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

 

Аватара для Aleksoid1978

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


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

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


Всем привет. На днях нашел тут код как Закрепить значок на панели задач в Win7. Все получилось, кроме одного - при наличии на панели уже такого ярлыка - создается ярлык типа MPC-BE(2).lnk;

Вот сам код
Код: Выделить весь код
const
  installer_mutex = 'mpcbe_setup_mutex';
  LOAD_LIBRARY_AS_DATAFILE = $2;

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExW@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadStringW@user32.dll stdcall';

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
	hInst: THandle;
  buf: array [0..255] of char;
  i, Res: Integer;
  strVerb: String;
  objShell, colVerbs: Variant;
begin
  if not FileExists(Filename) then Exit;
  if IsPin then Res := 5386 else Res := 5387;
  begin
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
      for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
      try
        objShell := CreateOleObject('Shell.Application');
      except
        ShowExceptionMessage;
        Exit;
      end;
      colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
      for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
      begin
        colVerbs.Item[i].DoIt;
        Break;
      end;
    finally
      FreeDLL(hInst);
    end;
  end;
end;
вот вызов
Код: Выделить весь код
if IsTaskSelected('pintotaskbar') then begin
    PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
end;
Получается что задать вручную имя ярлыка в этом случае я немогу. Подскажите гуру Inno

Отправлено: 15:51, 11-09-2012 | #891



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

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


Аватара для SatHan

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


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

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


Цитата R.i.m.s.k.y.:
пути в переменную %PATH% »
Спасибо что напомнили. Как раз интересовал вопрос по этому поводу.

Системные переменные
Переменная - Path, значение - %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
появилась необходимость к значению %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem добавить C:\Program Files\Progs
В идеале при установке должно получится так
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Progs
как это сделать через инно?
в секции [setup] нашёл ChangesEnvironment=true только мне это мало о чём говорит.

Последний раз редактировалось SatHan, 11-09-2012 в 16:34.


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


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

Ветеран


Contributor


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

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


Цитата SatHan:
появилась необходимость к значению %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem добавить C:\Program Files\Progs
В идеале при установке должно получится так
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Progs
как это сделать через инно? »
SatHan, можно, конечно, и в секции Registry это сделать:
Код: Выделить весь код
Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Control\Session Manager\Environment; ValueType: expandsz; ValueName: Path; ValueData: {olddata};{app}; Flags: noerror
Но нужно еще проверять наличие вносимого значения, чтобы второй (и больше) раз не вносить одно и тоже, а также удалить значение при деинсталляции. Поэтому лучше свою процедуру накидать. Например:
читать дальше »

Код: Выделить весь код
procedure ManagePathVariable(Variable: String; IsAddVariable: Boolean); //Variable - добавляемое значение; IsAddVariable - флаг добавить/удалить значение
var
    Path: String;
begin
    if RegQueryStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', Path) then
    begin
        if IsAddVariable then
            if Pos(Lowercase(Variable), Lowercase(Path)) = 0 then
                RegWriteExpandStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', Path + ';' + Variable);
        if not IsAddVariable then
            if Pos(Lowercase(Variable), Lowercase(Path)) > 0 then
            begin
                StringChangeEx(Path, ';' + Variable, '', True);
                RegWriteExpandStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', Path);
            end;
    end;
end;

//пример вызова
procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then ManagePathVariable('%ORACLE_HOME%', True);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    if CurUninstallStep = usPostUninstall then ManagePathVariable('%ORACLE_HOME%', False);
end;


Цитата SatHan:
в секции [setup] нашёл ChangesEnvironment=true только мне это мало о чём говорит. »
SatHan, разумеется, нужна эта директива
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:42, 11-09-2012 | #893


Аватара для MogilShik2007

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


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

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


Господа, может просветите)))
При работе с ReDrawText как в скрипте прописать, чтоб работало на разных страницах, а не на одной?
Или на одной, но в разных местах...

Или как по другому цвет нужных слов на разных страницах менять?

Последний раз редактировалось MogilShik2007, 11-09-2012 в 18:21.


Отправлено: 18:01, 11-09-2012 | #894


Аватара для Johny777

Ветеран


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

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


El Sanchez,
блин
чуть мозг себе не спалил нафиг
но допер таки как использовать

Код: Выделить весь код
procedure InitializeWizard();
var
    iFile: TIniFile;
    i, j: Integer;
    res: String;
begin
    iFile := ParseIniFile('C:\setup\Selfish.ini');
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        res := res + '[' + iFile[i].Section + ']' + #13#10;
        for j := 0 to GetArrayLength(iFile[i].Entries)-1 do
            res := res + iFile[i].Entries[j].Name + '=' + iFile[i].Entries[j].Value + #13#10;
    end;
    MsgBox(res, mbInformation, MB_OK);
    

    //// первая 2-ка - номер секции (отсчёт от нуля) вторая 2-ка - номер ключа секциии(отсчёт от нуля)
    Variable := iFile[2].Entries[2].Value  = '1'      /// отсчёт от нуля
    if Variable = True then MsgBox('ок', mbInformation, MB_OK);
end;
скажи только пожалуйста как получить индекс ключа и секции по имени оных?

Цитата El Sanchez:
на моей машине обращение к элементам массива примерно в 120 раз быстрее. »
Здраво!
конечно смысла считывать из одной секции значение одного ключа - слишком, но для длинных ini этот код себя 120 раз оправдает

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

Цитата Aleksoid1978:
Получается что задать вручную имя ярлыка в этом случае я немогу. »
что ты имеешь в виду под именем?
на панели задач ярлыки - только иконки
если ты имеешь в виду имя файла, то файл(вместе с путём к нему) к которому ты хочешь протянуть ярлык указывается в первом входном параметре функции PinToTaskbar

Последний раз редактировалось Johny777, 11-09-2012 в 20:07.

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

Отправлено: 18:43, 11-09-2012 | #895


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

Ветеран


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

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


El Sanchez, SatHan, я тоже поначалу так пробовал, полная фигня получается
Теперь делаю через стороннюю утилитку pathman
Код: Выделить весь код
[Run]
Filename: {app}\PATHMAN.EXE; Parameters: " /as ""{app}"""; Flags: runhidden waituntilterminated

[UninstallRun]
Filename: {app}\PATHMAN.EXE; Parameters: " /rs ""{app}\"""; Flags: runhidden waituntilterminated

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

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

Отправлено: 18:48, 11-09-2012 | #896


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

Ветеран


Contributor


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

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


Цитата Johny777:
скажи только пожалуйста как получить индекс ключа и секции по имени оных? »
Johny777, перебором элементов массив(ов)а. Ты, пока не исправил свой пост, использовал функцию IndexOf класса TStrings. С его использованием код можно упростить, ведь в арсенале TStrings есть все необходимое для обработки строк типа name=value:
читать дальше »

Код: Выделить весь код
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
    i: Integer;
    res: String;
begin
    //парсим ini-файл
    iFile := ParseIniFile('d:\Program Files (x86)\Inno Setup 5\projects\johny777\test.ini');

    //пример 1 - выводим на экран содержимое ini-файла, используя созданную переменную iFile
    for i := 0 to GetArrayLength(iFile)-1 do
        res := res + '[' + iFile[i].Section + ']' + #13#10 + iFile[i].Entries.Text;
    MsgBox(res, mbInformation, MB_OK);
    
    //пример 2 - выводим на экран значение параметра name34 секции section2, используя созданную переменную iFile и свою функцию GetIniValue
    MsgBox(GetIniValue('section2', 'name34', '', iFile), mbInformation, MB_OK);
end;


Цитата R.i.m.s.k.y.:
я тоже поначалу так пробовал, полная фигня получается
Теперь делаю через стороннюю утилитку pathman »
R.i.m.s.k.y., например? Это вполне нормальный способ, вышеназванная утилита делает то же самое.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:14, 11-09-2012 | #897


Аватара для Johny777

Ветеран


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

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


Цитата El Sanchez:
Ты, пока не исправил свой пост, использовал функцию IndexOf класса TStrings »
да
пока не подумал, что не подходит тк у тебя свой тип - TIniFile и что нужна самописная функция поиска индекса
Оказалось в правильном направлении подумал (радует )

Цитата MogilShik2007:
ReDrawText не сталкивался? А то не пойму как разноцветный текст на разных страницах делать »
а в чём собственно говоря проблема?
ты же судя по коду уже сделал разноцветный текст на первой странице
вот держи
у меня есть другой пример отрисовки текста http://sendfile.su/668402
попробуй с ним
используй функцию
function WriteText(s: string; Left, Top, Right: integer; Parent: TWinControl): TLabelString;
.............название(твой текст; слева, сверху, ширина; родитель(например WizardForm.WelcomePage):

Цитата MogilShik2007:
у тебя стоит значение 500, эт что такое? »
кажись интенсивность огня
поиграйся с настройкой - узнаешь

вот держи набор китайских библиотек с примерами http://sendfile.su/668398

Последний раз редактировалось Johny777, 12-09-2012 в 02:39.

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

Отправлено: 01:22, 12-09-2012 | #898


Аватара для Aleksoid1978

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


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

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


Johny777,
Цитата Johny777:
что ты имеешь в виду под именем?
на панели задач ярлыки - только иконки
если ты имеешь в виду имя файла, то файл(вместе с путём к нему) к которому ты хочешь протянуть ярлык указывается в первом входном параметре функции PinToTaskbar »
Я говорил про имя создаваемого ярлыка.

Отправлено: 01:58, 12-09-2012 | #899


Аватара для Johny777

Ветеран


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

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


Цитата Aleksoid1978:
Я говорил про имя создаваемого ярлыка. »
я не совсем догоняю
смотри скрин



у значков в панели задач (куда функция El Sanchez-а их закрепляет) нет имени

Отправлено: 02:14, 12-09-2012 | #900



Компьютерный форум 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




 
Переход