|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
Ветеран Сообщения: 1269 |
Профиль | Отправить PM | Цитировать
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты 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 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата 1specific:
Inno Setup "MSXML2.XMLHTTP"|"Microsoft.XMLHTTP" POST Send - Поиск в Google. Вот типичный образец использования класса (причём, даже с разбором ответа сервера). Если вместо «Inno Setup» укажете «VBScript», или «VB», или «VBA» — найдёте уйму примеров, которые только и останется, что перевести с VBScript на Pascal. Цитата 1specific:
Я бы нацарапал, но думаю, у более опытных в Pascal коллег сие выйдет гораздо лучше. |
||
Отправлено: 00:34, 21-01-2019 | #211 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 54
|
Профиль | Отправить 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, 21-01-2019 | #212 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать Эмм, попробую перефразировать по другому...
Я делаю установку программы, которая требует PowerShell последней версии 5.1 для Windows 7/8.0/8.1 (на 10-ке она стоит из коробки). Так вот, я хочу в инсталляторе отобразить детализацию скачивания файла обновления и убрать там кнопку "Скрыть/Показать". Но если я добавляю этот код, тогда программа вылетает с ошибкой "could not call proc". Поэтому я прошу помощи - что я делаю не так? Выше наверное никому не понятен мой сокращённый код. Выкладываю готовый код, тоже сокращённый (выкинул все лишние файлы и строки программы), но код компилируемый и рабочий:
Если у вас 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; Что интересно, при условии = (равенства), никакой ошибки при компиляции не происходит. Пожалуйста профи, не игнорируйте, помогите... |
Отправлено: 00:40, 22-01-2019 | #213 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Исключение - изменение названия инсталлятора перед тем как отдать юзеру. Но высока вероятность что юзер его поменяет. Цитата Iska:
Так что буду рад сотрудничеству, если вы готовы. |
||
Отправлено: 10:53, 22-01-2019 | #214 |
Ветеран Сообщения: 1269
|
Профиль | Отправить PM | Цитировать Цитата TROY Diamond:
Цитата TROY Diamond:
Цитата 1specific:
Цитата ErikPshat:
|
||||
Отправлено: 11:27, 22-01-2019 | #215 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать El Sanchez, ну когда выйдет версия 10, тогда уже меня не будет ))) Да и даже когда она будет, то всё равно она менее сегодняшней 5.1 не станет по условию. Просто прога требует такую версию, но только в меньших версиях её код не срабатывает, поэтому для работы проги требуется не менее 5.1. Я рад, что хоть так работает )). Насчёт 2-го понял, приму к сведению.
Цитата El Sanchez:
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. Трудно мне до этого догнать, я всего-то пару месяцев как начал осваивать Inno Setup. |
|
Последний раз редактировалось ErikPshat, 22-01-2019 в 15:50. Отправлено: 15:39, 22-01-2019 | #216 |
Ветеран Сообщения: 1269
|
Профиль | Отправить PM | Цитировать Цитата 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, 22-01-2019 в 18:02. Отправлено: 17:31, 22-01-2019 | #217 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата 1specific:
Цитата 1specific:
Цитата 1specific:
|
|||
Отправлено: 19:01, 22-01-2019 | #218 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Чтобы считать количество уникальных скачиваний и знать от какого из партнеров был скачан и установлен файл делается связка md5+hwid Где md5 привязывается к партнеру в БД и генерится на сервере путем добавления байтов, а hwid как показатель уникальности установки. После чего данные проверяются, если установка уникальна (hwid,ip и т п), то партнеру засчитывается +1 установка (партнер определяется по md5). Сгенерировать отдельный установщик под партнера (или как вы говорите GUID) возможно, если бы партнеров было 5-10 или 30. Но партнеров много, и неизвестно сколько. Под каждого генерить установщик это проблемно. Потом их все залить на хост - это уйма места. И далее если программа обновилась, это что каждому партнеру снова собирать и заливать установщик и закреплять руками md5 для каждого? Поэтому было принято такое решение - исходный файл один, а далее под партнера при скачивании по его реф. ссылке генерится md5, который записывается в базу. Надеюсь доступно описал весь процесс) Цитата Iska:
Цитата Iska:
|
|||
Последний раз редактировалось 1specific, 22-01-2019 в 23:25. Отправлено: 22:28, 22-01-2019 | #219 |
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать El Sanchez, о, спасибо большое! Как просто решаются сложные вопросы )) и как же сложно решить простые задачи ))
Я так понял, эта функция function StrCmpLogicalW - сравнение строк в Unicode-формате встроенными средствами Win API (String Compare Logical Wide). И вы мне подкинули решение сравнения версий. Немного не ясна для меня прозрачность логики работы (я так понял 5.2 была выставлена для теста?): if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', 'PowerShellVersion', PSVersion) or (StrCmpLogicalW(PSVersion, '5.1') < 0) then
Вторым условием производится сравнение версии из реестра с требуемой нами. Но тогда и оно не отрабатывает, тем более, если оставить там 5.2. Или я не правильно эту конструкцию читаю? По-моему, моя прежняя конструкция вполне прозрачна (для меня) и отрабатывает правильно, даже если завтра выйдет версия 10. Этот мой код с учётом вашей поправки насчёт лишнего ExpandConstant: RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion); if Copy(PSVersion,1,3) < '5.1' then На самом деле моей программе достаточно и PowerShell v5.0. Это прога по разбивке и упаковке папок на части по 4 Гб/2 Гб/Целиком, а так же, по загрузке файлов из интернета из XML со ссылками, контрольными суммами, и пр. тех. данными, и средствами PowerSell это удачно реализовалось. Для справки: на Win 7 из коробки установлена PS 2.0, на Win 8.0 стоит PS 3.0, на Win 8.1 - PS 4.0, на Win 10 - 5.0. Последняя стабильная 5.1. И больше на Windows 10 мало вероятно что предвидится. |
Последний раз редактировалось ErikPshat, 23-01-2019 в 02:50. Отправлено: 02:29, 23-01-2019 | #220 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты 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 |
|