Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
El Sanchez
02-07-2015, 16:30
а другая часть просто по пути Е/Приложение »
Irenis, ну и напишите для второй папки в секции Files в директиве DestDir:
DestDir: {drive:{app}}\Приложение
habib2302
02-07-2015, 21:12
как сделать в случае отмены установки исполняемого файла
[Run]
Filename: {sys}\msiexec.exe; Parameters: "/i {tmp}\SkypeSetup_7.6.0.103.msi /qb ALL_USERS=1 INSTALLDIR={app}";
не запускался следующий исполняемый файл по списку
[Run]
Filename: {win}\regedit.exe; Parameters: /s {tmp}\Reg-file.reg;
и как сделать проверку сумм файлов
Я как понимаю никому до меня нет дела!?
и как сделать проверку сумм файлов »
Пример (https://yadi.sk/d/H3_ccO_xheVwp)
И не стоит писать жирным шрифтом - кто в состоянии помочь - поможет. Не стоит думать, что кроме твоих проблем ни у кого нет других дел.
El Sanchez
03-07-2015, 16:15
как сделать в случае отмены установки исполняемого файла
не запускался следующий исполняемый файл по списку
»
habib2302,
Да никак, нужно проверять код возврата и по результатам проверки действовать дальше. Во время отработки секции Run код возврата не получить, он лишь пишется в Debug Output. А вот если запускать из секции Code при помощи Exec, то код возврата доступен.
Про закавычивание путей в Parameters не забываем, {tmp} и {app} еще как могут содержать whitespace-символы.
Зачем вообще отмену производить во время установки? Выбор ставить/не ставить нужно раньше делать, до нажатия на Установить, а не когда уже поздно.
habib2302
03-07-2015, 16:26
El Sanchez, просто в случае отмены установки допустим msi'шного инсталлятора (который запакован в мой инстал) из-за ошибки, то мой инстал продолжит установку
AlexM22204
08-07-2015, 20:57
Здравствуйте! Решил перепаковать для себя VMware Workstation 11.1.2
[Setup]
AppName=VMware Workstation
AppVersion=11.1.2
AppPublisher=(сборка)
VersionInfoVersion=11.1.2
CreateAppDir=no
OutputBaseFilename=Setup_VMware_11
SetupIconFile={app}\ws.ico
SolidCompression=yes
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
Uninstallable=no
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Files]
Source: "{app}\*"; DestDir: "{tmp}\vmware"; Flags: ignoreversion recursesubdirs createallsubdirs
[Tasks]
Name: "rus"; Description: "{cm:SetupLangPack}"; GroupDescription: "{cm:OtherOptions}"; Flags: checkablealone; MinVersion: 0.0,5.0
Name: "trayicon"; Description: "{cm:DelTrayIcon}"; GroupDescription: "{cm:OtherOptions}"; Flags: checkablealone; MinVersion: 0.0,5.0
[Run]
Filename: "{tmp}\vmware\uninstall.exe"; Parameters: "/T ""{tmp}\vmware\install"" /v /s /S ""{tmp}\vmware"""
Filename: "TASKKILL"; Parameters: "/F /IM ""vmware-tray.exe"""; Flags: runhidden; MinVersion: 0.0,5.0; Tasks: trayicon
Filename: "{tmp}\vmware\VMware-ru-ru.exe"; Parameters: "/s"; MinVersion: 0.0,5.0; Tasks: rus
[Registry]
Root: "HKCU"; Subkey: "Software\VMware, Inc.\VMware Tray"; ValueType: dword; ValueName: "TrayBehavior"; ValueData: "$00000002"; Flags: uninsdeletevalue uninsdeletekeyifempty; Tasks: trayicon
[CustomMessages]
russian.DelTrayIcon=Отключить отображение иконки в трее
russian.SetupLangPack=Установить русский языковой пакет
russian.OtherOptions=Дополнительные параметры:
[Code]
///Удалить кнопки свернуть, развернуть из окна инсталлятора
const
GWL_STYLE = -16;
WS_MINIMIZEBOX = $20000;
WS_MAXIMIZEBOX = $10000;
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
procedure initializeWizard();
begin
SetWindowLong(WizardForm.handle, GWL_STYLE, GetWindowLong(WizardForm.handle, GWL_STYLE)and(not WS_MINIMIZEBOX)and(not WS_MAXIMIZEBOX));
end;
Но одно но... Программа только для 64-bit систем, как организовать перед запуском инсталятора проверку, если система 64-bit - то продолжается установка, если система 32-bit - появляется окно с сообщением о несоответствии системы и предложение прекратить установку. :(
Dodakaedr
09-07-2015, 13:20
AlexM22204, в справке про секцию [setup] прочтите, там есть ответ на ваш вопрос. По поводу битности системы.
kotyarko@fb
09-07-2015, 22:20
Программа только для 64-bit систем, как организовать перед запуском инсталятора проверку »
Самый простой способ:[Setup]
ArchitecturesAllowed=x64
Sotonisto
09-07-2015, 23:09
Доброго времени суток.
Есть инсталлятор (с использованием ботвы), у которого два "фоновых" изображения:
img1:=ImgLoad(WizardForm.Handle, ExpandConstant('img1.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
img2:=ImgLoad(WizardForm.Handle, ExpandConstant('img2.jpg'), ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
Я решил добавить кнопку, после нажатия на которую должен появиться определенный текст, а один из фонов - исчезнуть.
Попытался реализовать так:
procedure TestBtnHide(hBtn:HWND);
begin
TestLabel.Show;
TestLabel.Caption:= ExpandConstant('{cm:TestLabel2}');
ImgSetVisibility(img2, false);
end;
procedure TestBtnShow(hBtn:HWND);
begin
TestLabel.Show;
TestLabel.Caption:= ExpandConstant('{cm:TestLabel1}');
ImgSetVisibility(img2, true);
end;
В итоге: с текстом всё отлично, но вот изображение никак не реагирует. В чем ошибка, или нужно использовать другую функцию?
kotyarko@fb
10-07-2015, 08:57
В итоге: с текстом всё отлично, но вот изображение никак не реагирует. »
Пробуйте так:
procedure TestBtnHide(hBtn:HWND);
begin
TestLabel.Show;
TestLabel.Caption:= ExpandConstant('{cm:TestLabel2}');
ImgSetVisibility(img2, false);
ImgApplyChanges(WizardForm.Handle);
end;
procedure TestBtnShow(hBtn:HWND);
begin
TestLabel.Show;
TestLabel.Caption:= ExpandConstant('{cm:TestLabel1}');
ImgSetVisibility(img2, true);
ImgApplyChanges(WizardForm.Handle);
end;
Sotonisto
10-07-2015, 10:38
kotyarko@fb, спасибо вам большое. Теперь все работает как надо.
habib2302
10-07-2015, 20:20
Доброе время суток. Как сделать допустим разрегистрацию dll'ки через Exec перед установкой
Dodakaedr
10-07-2015, 20:28
Как сделать допустим разрегистрацию dll'ки через Exec перед установкой »
procedure CurStepChanged(CurStep: TSetupStep);
var
RC: integer;
begin
if CurStep = ssInstall {или ssPreInstall} then
Exec(ExpandConstant('{sys}\regsvr32.exe'), ' /u /s ' + 'test.dll', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, RC)
end;
habib2302
10-07-2015, 22:13
Dodakaedr, а как сделать разрегистрацию перед распаковкой файлов в зависимости от компонента
habib2302, в зависимости от компонента
procedure CurStepChanged(CurStep: TSetupStep);
var
RC: integer;
begin
// if CurStep = ssInstall {или ssPreInstall} then
case CurStep of ssInstall: {или ssPreInstall}
if IsComponentSelected('r\b') {или if Installer.Checked} then
Exec(ExpandConstant('{sys}\regsvr32.exe'), ' /u /s ' + 'test.dll', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, RC)
end;
end;
Если вариантов всего два, то можно обойтись и оператором IF. Но если их, например, десять? В этом случае оптимален оператор варианта CASE.
habib2302
11-07-2015, 08:52
Dodakaedr,
http://savepic.ru/7577633.png (http://savepic.ru/7580705.png)
kotyarko@fb
11-07-2015, 08:54
habib2302, if CurStep = ssInstall then
Uragan66
11-07-2015, 14:25
Всем доброго времени суток ! Может кто поможет реализовать такую идею : Нужно до страницы выбора папки назначения вставить страницу с выбором типа установки :
"Установка" или "Распаковка" (они должны быть взаимоисключающими т.е. с флагом exclusive ).
Если выбрана "Установка" то дальше установка должна идти как обычно (выбор папки, выбор компонентов и т.д. )
При выборе "Распаковка" должна быть страница выбора папки назначения и дальше просто распаковка в указанную пользователем папку. Можно это решить ?
palsn2000
12-07-2015, 19:35
Доброе время суток. У меня возникли трудности с закрытием процесса. Нашел пример и на его основе попытался изобразить для своего случая:
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usUninstall then
begin
Exec('taskkil','/f /im FmsProxy.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
end;
end;
В итоге ничего не происходит - процесс как работал, так и продолжает работать.
На всякий случай: http://s015.radikal.ru/i331/1507/f1/d22a9fc29b4b.jpg
Что у меня в записи с taskkil не так?
Заранее спасибо.
________
P.S. И кстати ещё один момент - как видно на скриншоте этих процессов FmsProxy.exe может быть несколько - может из-за этого не работает, и тогда как убить их все разом?
habib2302
12-07-2015, 19:52
palsn2000,
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('winamp.exe', false) then
begin
if MsgBox('Программа Winamp используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('winamp.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
[Code]
// функции используемые при деинсталляции
// RunTask@{app}\ISTask.dll - название функции (в данном случае, если программа работает)
// и путь dll'ки где она расположена...
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
if RunTask('winamp.exe', False) then
begin
// прячем форму
UninstallProgressForm.Visible:= False;
if MsgBox('Программа winamp.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
begin
KillTask('winamp.exe');
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
// показываем форму
UninstallProgressForm.Visible:= True;
end
else
begin
MsgBox('Завершите работу winamp.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
Abort;
end;
end;
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.