PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 [39] 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

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;
и как сделать проверку сумм файлов

Я как понимаю никому до меня нет дела!?

nik1967
03-07-2015, 16:07
и как сделать проверку сумм файлов »
Пример (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, а как сделать разрегистрацию перед распаковкой файлов в зависимости от компонента

TryRooM
11-07-2015, 00:06
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