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

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

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

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

Ветеран


Contributor


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


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

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


Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



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

Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z
Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z
Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 04-04-2018

 

Ветеран


Contributor


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

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


Цитата 1specific:
Вообще для меня тёмный лес. Возможно это гениальная идея, но к сожалению я не в состоянии оценить))) »
Ничего гениального в этом нет, обычная отсылка запроса, использующая готовую библиотеку посредством Automation. Примеры можно найти запросом по тем же ключевым словам, например:
Inno Setup "MSXML2.XMLHTTP"|"Microsoft.XMLHTTP" POST Send - Поиск в Google. Вот типичный образец использования класса (причём, даже с разбором ответа сервера). Если вместо «Inno Setup» укажете «VBScript», или «VB», или «VBA» — найдёте уйму примеров, которые только и останется, что перевести с VBScript на Pascal.

Цитата 1specific:
Он будет всегда уникальный и генерируется на уровне сервера путем добавления байтов, перед тем как отдать его на скачивание. »
И этого бы я не советовал делать — на подобные вещи могут весьма нервно реагировать поведенческие анализаторы проактивной защиты антивирусов (вкупе с тем, что планируется, что инсталлятор будет «стучать» в сеть — чую, получится убойный эффект a-la красной тряпки для быка).

Я бы нацарапал, но думаю, у более опытных в Pascal коллег сие выйдет гораздо лучше.

Отправлено: 00:34, Вчера | #211



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

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


Аватара для ErikPshat

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


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

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


Можете подсказать, почему у меня ошибка could not call proc?

Пытаюсь при запуске инсталлятора проверить установленную версию PowerShell и если она меньше 5.1, тогда скачивать и устанавливать её.
Вот такой сокращённый код:
Код скрипта
Код: Выделить весь код
[Setup]
AppName=PowerShell
AppVersion=5.1

[Files]
Source: "embedded\ISSkin\ISSkinU.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\ISSkin\Styles\{#Skin}.cjstyles"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.exe"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.exe"; DestDir: {tmp}; Flags: dontcopy

[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"

[CustomMessages]
ru.Caution7064=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 7 64bit.%n%nПожалуйста, дождитесь завершения обновления!

[_Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:ISSkinU.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:ISSkinU.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  Result := (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor));
end;

function IsWindows70OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 1); end;
function IsWindows80OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 2); end;
function IsWindows81OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 3); end;
function IsWindows10OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(10,0); end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('{#Skin}.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\{#Skin}.cjstyles'), 'normalmystyle.ini');
	Result := True;
end;

// Скачиваем PowerShell 5.1 под нашу версию Windows и битность...
procedure InitializeWizard;
var
  PSVersion: String;
begin
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion);
  if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then
   begin
    if IsWin64 then
     begin
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7AndW2K8R2-KB3191566-x64.zip',ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip'),68076477); end else
      if IsWindows80OrNewer and not IsWindows81OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8064}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/W2K12-KB3191565-x64.msu',ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),21585220); end else
      if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8164}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1AndW2K12R2-KB3191564-x64.msu',ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),19878906); end;
      idpDownloadAfter(wpReady);
     end
    else
     begin
      if IsWindows70OrNewer and not IsWindows80OrNewer then begin MsgBox(ExpandConstant('{cm:Caution7032}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7-KB3191566-x86.zip',ExpandConstant('{tmp}\Win7-KB3191566-x86.zip'),44821734); end else
      if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8132}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1-KB3191564-x86.msu',ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),15231117); end;
      idpDownloadAfter(wpReady);
     end;
   end;
end;

// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки... 
procedure CurPageChanged(CurPageID: Integer); 
begin 
 if not IsWindows10OrNewer then
   begin
    if CurPageID = IDPForm.Page.ID then 
    begin 
    // Показать детали загрузки 
    idpShowDetails(True); 
    // Скрываем кнопку Подробно/Скрыть 
    IDPForm.DetailsButton.Visible := False; 
    end;
  end; 
end;

// Распаковываем ранее скачанный ZIP/MSU и запускаем установку... 
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssPostInstall then 
   begin
    if IsWin64 then
     begin
      if FileExists(ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip')) then
       begin
        ExtractTemporaryFile('7z.exe');
        ExtractTemporaryFile('7z.dll');
        ShellExec('open',ExpandConstant('{tmp}\7z.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7AndW2K8R2-KB3191566-x64.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
        ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7AndW2K8R2-KB3191566-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
       end;
      if FileExists(ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      if FileExists(ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
     end
    else
     begin
      if FileExists(ExpandConstant('{tmp}\Win7-KB3191566-x86.zip')) then
       begin
        ExtractTemporaryFile('7z32.exe');
        ExtractTemporaryFile('7z32.dll');
        ShellExec('open',ExpandConstant('{tmp}\7z32.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7-KB3191566-x86.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
        ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7-KB3191566-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
       end;
      if FileExists(ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
     end;
   end;
end;

procedure DeinitializeSetup();
begin
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  UnloadSkin();
end;

Поясняю, ошибка возникает, когда я после скачивания PowerShell вставляю код открытия детализации "Показать" и скрытия кнопки "Скрыть" на странице скачивания.
Без этого кода всё работает нормально.
А при вставке кода, сразу ошибка, причём только при условия меньше или больше, а при равенстве условия сравнения версий, всё отрабатывает правильно.
Вот этот короткий код в скрипте:
Код в скрипте, приводящий к ошибке: "could not call proc"
Код: Выделить весь код
// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки... 
procedure CurPageChanged(CurPageID: Integer); 
begin 
 if not IsWindows10OrNewer then
   begin
    if CurPageID = IDPForm.Page.ID then 
    begin 
    // Показать детали загрузки 
    idpShowDetails(True); 
    // Скрываем кнопку Подробно/Скрыть 
    IDPForm.DetailsButton.Visible := False; 
    end;
  end; 
end;

Отправлено: 21:36, Вчера | #212


Аватара для ErikPshat

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


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

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


Эмм, попробую перефразировать по другому...
Я делаю установку программы, которая требует PowerShell последней версии 5.1 для Windows 7/8.0/8.1 (на 10-ке она стоит из коробки).
Так вот, я хочу в инсталляторе отобразить детализацию скачивания файла обновления и убрать там кнопку "Скрыть/Показать".
Но если я добавляю этот код, тогда программа вылетает с ошибкой "could not call proc".
Поэтому я прошу помощи - что я делаю не так?

Выше наверное никому не понятен мой сокращённый код.
Выкладываю готовый код, тоже сокращённый (выкинул все лишние файлы и строки программы), но код компилируемый и рабочий:В строке №76 выставлено условие сравнения < (меньше)
Код: Выделить весь код
if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then
Если у вас PowerShell устаревшая меньшей версии, тогда будет скачивание и установка.
А если у вас PowerShell уже обновлена, тогда вам нужно будет поменять на = (равно), иначе ничего происходить не будет.

Далее, нужно раскомментировать код отображения детализированных данных между строками 105 - 120:
Код: Выделить весь код
procedure CurPageChanged(CurPageID: Integer); 
begin 
 if not IsWindows10OrNewer then
  begin
   if CurPageID = IDPForm.Page.ID then 
    begin 
     // Показать детали загрузки 
     idpShowDetails(True); 
     // Скрываем кнопку Подробно/Скрыть 
     IDPForm.DetailsButton.Visible := False; 
    end;
  end; 
end;
И при условии < попробовать скомпилировать и найти ошибку, почему в этом случае выскакивает "could not call proc".
Что интересно, при условии = (равенства), никакой ошибки при компиляции не происходит.
Пожалуйста профи, не игнорируйте, помогите...

Отправлено: 00:40, Сегодня | #213


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


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

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


Цитата Iska:
И этого бы я не советовал делать — на подобные вещи могут весьма нервно реагировать поведенческие анализаторы проактивной защиты антивирусов »
Согласен. Риск есть и риск высок. Но мне что-то не приходят другие варианты в голову, как за что еще можно зацепиться, чтобы был некий уникальный параметр установщика без его пересборки.
Исключение - изменение названия инсталлятора перед тем как отдать юзеру. Но высока вероятность что юзер его поменяет.

Цитата Iska:
Я бы нацарапал, но думаю, у более опытных в Pascal коллег сие выйдет гораздо лучше. »
А более опытные коллеги видимо даже не обратят внимание на мой пост)) Таких как вы по пальцам одной руки пересчитать можно)
Так что буду рад сотрудничеству, если вы готовы.

Отправлено: 10:53, Сегодня | #214


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

Ветеран


Contributor


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

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


Цитата TROY Diamond:
а если НЕ "забивать"? )) »
TROY Diamond, вы не знаете размер будущих архивов, поэтому DiskSpaceLabel-у вам нечего предложить.
Цитата TROY Diamond:
Как сделать чтобы по умолчанию полученный установщик требовал для запуска права Администратора? "PrivilegesRequired=admin", - НЕ даёт нужного эффекта »
TROY Diamond, разработчик руководствуется тупыми гайдами от Microsoft по разработке десктопных приложений, хотя, возможно, баг, но баг слишком уж долгоживущий в официальной версии, чтобы быть багом. Китайская версия данного поведения не имеет.
Цитата 1specific:
за что еще можно зацепиться, чтобы был некий уникальный параметр установщика без его пересборки. »
1specific, например, GUID в конец инсталлятора. Но сначала четко определитесь с термином "успешная установка".
Цитата ErikPshat:
if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then »
ErikPshat, во-первых, нельзя так версионные строки сравнивать. Когда-нибудь PSVersion станет 10.0 и это условие станет истинным. Во-вторых, ExpandConstant лишние, нет там брекетированных констант. В-третьих, ошибка у вас тогда, когда это выражение не истинно -> не выполняются idp-функции -> не создается IDPForm. И уже в CurPageChanged идет обращение к несуществующей IDPForm.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:27, Сегодня | #215


Аватара для ErikPshat

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


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

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


El Sanchez, ну когда выйдет версия 10, тогда уже меня не будет ))) Да и даже когда она будет, то всё равно она менее сегодняшней 5.1 не станет по условию. Просто прога требует такую версию, но только в меньших версиях её код не срабатывает, поэтому для работы проги требуется не менее 5.1. Я рад, что хоть так работает )). Насчёт 2-го понял, приму к сведению.

Цитата El Sanchez:
В-третьих, ошибка у вас тогда, когда это выражение не истинно -> не выполняются idp-функции -> не создается IDPForm. И уже в CurPageChanged идет обращение к несуществующей IDPForm. »
Вот это мне и непонятно, что нужно сделать, чтобы заставить эту функцию отрабатывать именно после инициализации IDP.Form?
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. Трудно мне до этого догнать, я всего-то пару месяцев как начал осваивать Inno Setup.

Последний раз редактировалось ErikPshat, Сегодня в 15:50.


Отправлено: 15:39, Сегодня | #216


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

Ветеран


Contributor


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

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


Цитата ErikPshat:
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. »
ErikPshat,
Скрытый текст

Код: Выделить весь код
function StrCmpLogicalW(psz1, psz2: string): Integer; external 'StrCmpLogicalW@shlwapi.dll stdcall';

procedure InitializeWizard;
var
  PSVersion: string;
begin
  if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', 'PowerShellVersion', PSVersion) or
    (StrCmpLogicalW(PSVersion, '5.2') < 0) then
  begin
    { ... }
    { IDPForm.Page is create inside idpDownloadAfter. }
    idpDownloadAfter(wpReady);
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if not IsWindows10OrNewer and
    Assigned(IDPForm.Page) then
  begin
    if CurPageID = IDPForm.Page.ID then
    begin
      { ... }
    end;
  end;
end;

Последний раз редактировалось El Sanchez, Сегодня в 18:02.


Отправлено: 17:31, Сегодня | #217


Ветеран


Contributor


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

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


Цитата 1specific:
А более опытные коллеги видимо даже не обратят внимание на мой пост)) »
Обратят.

Цитата 1specific:
Таких как вы по пальцам одной руки пересчитать можно) »
Это далеко не так.


Цитата 1specific:
чтобы был некий уникальный параметр установщика »
Но зачем? Я бы просто генерировал тот же GUID на завершающем этапе установки — вот Вам и уникальность. А файл инсталляции должен быть одинаков для всех.

Отправлено: 19:01, Сегодня | #218



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты 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




 
Переход