Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]
Gnom_aka_Lexander
05-12-2011, 11:19
Теперь точно, отвесил до зубов, мне теперь этого на целый год хватит.
А как нибудь попроще нельзя? А то как бы я в этих тонкостях не волоку. »
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
[*Code]
const
MAX_PATH = 260;
// Папка пользователя (обычно C:\Documents and Settings\username)
CSIDL_PROFILE = $28;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
external 'SHGetSpecialFolderPathA@shell32.dll stdcall';
function GetSpecialPath(CSIDL: Word): string;
var
s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
Result:= PChar(s);
end;
procedure InitializeWizard;
begin
// определим расположение папки пользователя
MsgBox(GetSpecialPath(CSIDL_PROFILE), mbInformation, MB_OK);
end;
procedure DeinitializeUninstall();
begin
DelTree(GetSpecialPath(CSIDL_PROFILE)+'\папка',True,False,False);
end; Както так пробуй.
R.i.m.s.k.y., уже :) просто не хочет, почемуто работать в CurUninstallStepChanged, попробовал в DeinitializeUninstall - там заработало.
R.i.m.s.k.y.
05-12-2011, 11:27
Лександер, ты через реестр хочешь выдирать путь до папок? неправильно, сильно глюкаво сие есть
лучше пример из шапки адаптируй как Devils Night надо
не, я мог бы и сам, но мой большой толстый скрипт из которого я примеры дергаю лежит дома
а тут делов то, к CurUninstallStepChanged прикрутить удаление папки из перечисленного в шапке
R.i.m.s.k.y.
05-12-2011, 11:59
как-то так
const
MAX_PATH = 260;
// Папка пользователя (обычно C:\Documents and Settings\username)
CSIDL_PROFILE = $28;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
external 'SHGetSpecialFolderPathA@shell32.dll stdcall';
function GetSpecialPath(CSIDL: Word): string;
var
s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
Result:= PChar(s);
end;
procedure RD(Dir:string);
begin
Exec('cmd.exe', ' /c rd /S /Q ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;
procedure RF(file:string);
begin
Exec('cmd.exe', ' /c del /F /Q ' + AddQuotes(file),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
Exec('cmd.exe', ' /c erase /F /Q ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then RD(RemoveBackslashUnlessRoot(GetSpecialPath(CSIDL_PROFILE))+'\MyProgs');
end;
инношные функции DelTree и RemoveFile какие-то капризные
я своими RD/RF пользуюсь
R.i.m.s.k.y.
05-12-2011, 12:24
Лександер, я вообще-то путь удаления взял из твоего скрипта выше
свой скрипт поправил
к тому же это плохой тон править сообщения выше после критики снизу :)
Gnom_aka_Lexander
05-12-2011, 12:32
к тому же это плохой тон править сообщения выше критики снизу »
Это на всякий случай, поскольку вариант рабочий, и лучше исправить. то, что он у меня не отработал, еще не значит, что не сработает еще у когото.это значит ровно то что у кого-то еще он тоже не сработает »
Не отработала функция DelTree, но на семерке она так-же, видимо через раз работает. Это не значит, что она не сработает ни у кого.
Разве нет?
R.i.m.s.k.y.
05-12-2011, 12:37
Это на всякий случай, поскольку вариант рабочий, и лучше исправить. то, что он у меня не отработал, еще не значит, что не сработает еще у когото »
это значит ровно то что у кого-то еще он тоже не сработает
я не знаю что там с DelTree, когда я столкнулся что на шаге ssInstall ничего не удаляется, я стал использовать RF/RD что в примере выше
El Sanchez
05-12-2011, 19:23
я не знаю что там с DelTree, когда я столкнулся что на шаге ssInstall ничего не удаляется »
Стало быть в папке есть файлы, занятые системой.
P.S. Получить userprofile штатно:
GetEnv('USERPROFILE');
GetShellFolderByCSIDL($28, True);
TROY Diamond
05-12-2011, 20:35
Если приложение "мультиразрядное"...
1. Сам по себе Inno Setup по умолчанию делает "универсальные" установщики, которые будут работать на всех ОС или нет?
Если к примеру, программа может работать как на 32-х, так и на 64-х разрядной версиях Windows, то нужно ли в скрипте установки указывать какие-нибудь дополнительные параметры?
Например:
"ArchitecturesAllowed=x86 x64 и/или "ArchitecturesInstallIn64BitMode=x64"?
А также если программа по умолчанию должна устанавливаться в в папку "Program Files", то путь прописывать какой константой:
"{pf}" или "{pf32}"?
Аналогичный вопрос по поводу папки Windows и System как с ними быть в 64-х разрядной ОС?
ИМЕЕТСЯ ВВИДУ, ЧТО ПРИЛОЖЕНИЕ СОДЕРЖИТ 64-Х РАЗРЯДНЫЕ МОДУЛИ: системные файлы, библиотеки, драйвера, а не просто поддерживают обе версии ОС.
Т.к. как большинство 32-х разрядных приложений может вполне нормально работать и на 64-х разрядной ОС!
ИЛИ ЖЕ ВСЕ ЭТИ "ТОНКОСТИ" НУЖНЫ ЛИШЬ КОГДА ПРИЛОЖЕНИЕ 64-х РАЗРЯДНОЕ и будет работать, только на 64-х разрядной ОС?
2. Ещё подобный вопрос по поводу 32-х разрядного приложения, которое будет запускаться на 64-х разрядной ОС, в таком случае, что писать в скрипте?
3. И последнее, когда приложение само по себе 64-х разрядное, то установщик для неё то же должен быть 64-х разрядным? Т.е. чтобы инстал был 64-х разрядным и вообще НЕ запускался на 32-х разрядной ОС.
Умеет ли Inno Setup это делать и можно ли собрать установщик для 64-х разрядного приложения на 32-х разрядной ОС?
R.i.m.s.k.y.
05-12-2011, 21:15
Сам по себе Inno Setup по умолчанию делает "универсальные" установщики, которые будут работать на всех ОС или нет »
да универсальные пока в ArchitecturesAllowed не указано иное, к примеру если указать ArchitecturesAllowed=х64 то на винх86 инсталлер выдаст сообщение что ОС не поддерживается и закроется, по умолчанию ArchitecturesAllowed не задан и инсталлер работает на винх86 как родной, в винх64 - как вин32 приложение
А также если программа по умолчанию должна устанавливаться в в папку "Program Files", то путь прописывать какой константой:
"{pf}" или "{pf32}" »
прописывать константой {app}
или зависит от самого приложения где ему комфортней
Аналогичный вопрос по поводу папки Windows и System как с ними быть в 64-х разрядной ОС »
в вин64 system32 теперь ютятся х64 компоненты, в syswow64 - это аналог system32, там проживают х32 компоненты
читай в справке 64-bit Installation Limitations и Install Mode: 32-bit vs. 64-bit
ИМЕЕТСЯ ВВИДУ, ЧТО ПРИЛОЖЕНИЕ СОДЕРЖИТ 64-Х РАЗРЯДНЫЕ МОДУЛИ: системные файлы, библиотеки, драйвера, а не просто поддерживают обе версии ОС.
Т.к. как большинство 32-х разрядных приложений может вполне нормально работать и на 64-х разрядной ОС! »
индивидуально отслеживать что куда пишется и раскидывать внимательно, системная функция IsWin64 тебе в помощь
ИЛИ ЖЕ ВСЕ ЭТИ "ТОНКОСТИ" НУЖНЫ ЛИШЬ КОГДА ПРИЛОЖЕНИЕ 64-х РАЗРЯДНОЕ и будет работать, только на 64-х разрядной ОС? »
тонкости есть всегда, но в данном акцепте в вин64 надо следить что-куда раскидывается независимо х64 или х32 приложение устанавливается
Ещё подобный вопрос по поводу 32-х разрядного приложения, которое будет запускаться на 64-х разрядной ОС, в таком случае, что писать в скрипте »
зависит от того что нужно приложению, не ставь ArchitecturesInstallIn64BitMode=x64 и в вин64 инно поставит твое х32 прогу как 32битное приложение
И последнее, когда приложение само по себе 64-х разрядное, то установщик для неё то же должен быть 64-х разрядным? »
инно 32 разрядный, поэтому он не может вызывать х64 библиотеки, но ставить может
пишешь ArchitecturesInstallIn64BitMode=x64
чтобы инстал был 64-х разрядным и вообще НЕ запускался на 32-х разрядной ОС. »
ArchitecturesAllowed=x64 и инсталлер на вин32 выдаст предупреждение и закроется
Умеет ли Inno Setup это делать и можно ли собрать установщик для 64-х разрядного приложения на 32-х разрядной ОС »
можно собрать инно64 но с нюансами, описанными в Install Mode: 32-bit vs. 64-bit
при четком понимании процесса и ясной голове проблем не возникнет
ПыСы: какие вопросы такие и ответы
ArchitecturesAllowed задает тип винды на котором запускается инсталлер
по умолчанию пустой, инсталлер работает в вин32 как родной, в вин64 как 32 битное приложение, если прописать только один тип винды, то на другой инсталлер не заработает, напишет неподдерживаемая венда и закроется
ArchitecturesInstallIn64BitMode=х64 говорит инсталлеру что в вин64 он будет как вин64 приложение, от этого зависят пути до папок, ключи реестра и прочее
прочитай 64-bit Installation Limitations и Install Mode: 32-bit vs. 64-bit
я не знаю что там с DelTree, когда я столкнулся что на шаге ssInstall ничего не удаляется »
Стало быть в папке есть файлы, занятые системой. »
а стандартная RD удаляет занятые файлы влет? так не бывает, что-то другое
Devils Night
06-12-2011, 02:59
Както так пробуй. »как-то так »GetEnv('USERPROFILE');
GetShellFolderByCSIDL($28, True); »
Лександер, R.i.m.s.k.y., El Sanchez, Спасибо вам ребятки огромное, но что-то никак.
Короче говоря
[UninstallDelete]
Name: {userdocs}\MyProgs; Type: filesandordirs
т.е из C:\Documents and Settings\iUser\Мои документы\MyProgs
всё прекрасно удаляет
[UninstallDelete]
Name: {userprofile}\MyProgs; Type: filesandordirs
C:\Documents and Settings\iUser\MyProgs - (%userprofile%\MyProgs)
ни в какую, что с выше приведёнными примерами, что без них, а нужно то, всего лишь удалить папку :cry:.
Вы конечно извините, но эти скрипты мне с трудом даются, где то могу понять, а где то нет, так что не обессудьте за тормознутость, да и прежде чем задать вопрос, я всегда смотрю справку. А поиск, а что поиск, там какие алгоритмы не вводи, всё равно выдаёт не то что нужно.
Еще три вопроса. Как сделать вот что?
1. Вопрос
a) При нажатии на кнопку выводил адрес шлюза с возможностью копирования его по кнопке.
b) Трассировку маршрута, т.е на странице дополнительных задач было окно в котором вводится шлюз и по нажатии Ок происходит трассировка или как там ещё называется.[ Code]
var
IPAddressEdit: TIPAddressEdit;
Button: TNewButton;
procedure RedesignWizardForm;
begin
//************************************ Трассировка ************************************
IPAddressEdit := TIPAddressEdit.Create(WizardForm);
with IPAddressEdit do
begin
Name := 'IPAddressEdit';
Parent := WizardForm.SelectTasksPage;
Left := ScaleX(8);
Top := ScaleY(200);
Width := ScaleX(150);
Height := ScaleY(21);
end;
IPAddressEdit.TabOrder := 2;
//************************************ Вывод Трассировка ************************************
//************************************ Кнопка Проверить шлюз ************************************
Button := TNewButton.Create(WizardForm);
with Button do
begin
Name := 'Button';
Parent := WizardForm;
Left := ScaleX(16);
Top := ScaleY(327);
Width := ScaleX(99);
Height := ScaleY(23);
Caption := 'Проверить шлюз';
end;
Button.TabOrder := 5;
//************************************ Кнопка Проверить шлюз ************************************
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
//************************************ Вывод шлюза ************************************
//Function InitializeSetup: Boolean;
//begin
//if MsgBox('Ваш шлюз: 000.000.000.000', mbError, MB_OK) = idYes then result := true else result := false;
//end;
//************************************ Вывод шлюза ************************************
//************************************ Вывод шлюза ************************************
var
Button1: TNewButton;
Function InitializeSetup: Boolean;
begin
if MsgBox('Ваш шлюз: 000.000.000.000', mbError, MB_OK) = idYes then result := true else result := false;
begin
Button1 := TNewButton.Create(WizardForm);
with Button1 do
begin
Name := 'Скопировать';
Parent := WizardForm;
Left := ScaleX(32);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(25);
end;
Button1.TabOrder := 5;
end;
end;
//************************************ Вывод шлюза ************************************Визуально представить это могу, но чтобы средствами Inno это сделать, просто в голове не укладывается.
2. Вопрос
Как сделать четыре кнопки Изменить, Запустить, Удалить и Отмена
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"
[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Messages]
rus.SetupWindowTitle={#AppName}
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion nocompression;
[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent
[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; ValueName: "Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletekey
[UninstallDelete]
Type: filesandordirs; Name: {app};
[ Code]
//************************************** Четыре кнопки **************************************
var
AppDir, unins, run: string;
ResultCode: Integer;
UninsButton, RunButton: TButton;
MyLabel: TLabel;
procedure ReadEntries;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\{#AppName}', 'Path', AppDir);
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;
procedure Uninstall(Sender: TObject);
begin
unins:='{#UnExe}';
ReadEntries;
if not (FileExists(AddBackslash(AppDir) + unins)) then
MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('{#AppName}') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
else
Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;
procedure RunProgramm(Sender: TObject);
begin
run:='{#AppExeName}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;
//************************************** Новый кнопарь *****************************************
procedure RunInstall(Sender: TObject);
begin
run:='{src}\{#InExe}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(ExpandConstant('{src}\{#InExe}'),'','',SW_SHOW,ewNoWait,ResultCode);
WizardForm.Close;
end;
//************************************** Новый кнопарь *****************************************
procedure NewForm;
begin
ReadEntries;
if (RegValueExists(HKLM, 'SOFTWARE\{#AppName}', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\{#AppExeName}')) then begin
with WizardForm do
begin
ClientWidth := ScaleX(395);
ClientHeight := ScaleY(120);
Bevel.Hide;
InnerNotebook.Hide;
OuterNotebook.Hide;
BorderStyle:= bsDialog;
Center;
with CancelButton do
begin
Left := WizardForm.CancelButton.Left -100;
Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
BringToFront;
end;
//************************************** Новый кнопарь *****************************************
RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.NextButton.Left -280;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
//Height := 22;
Parent:= WizardForm;
Caption:= 'Изменить';
OnClick := @RunInstall;
//Cursor:= crHand;
BringToFront;
end;
//************************************** Новый кнопарь *****************************************
UninsButton:= TButton.Create(WizardForm);
with UninsButton do
begin
Left := WizardForm.NextButton.Left -100;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
Parent:= WizardForm;
Caption:= 'Удалить';
OnClick := @Uninstall;
BringToFront;
end;
RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.BackButton.Left -110;
Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
Width:= WizardForm.BackButton.Width;
Parent:= WizardForm;
Caption:= 'Запустить';
OnClick := @RunProgramm;
BringToFront;
end;
MyLabel:= TLabel.Create(WizardForm);
with MyLabel do
begin
SetBounds(10,10,380,80);
AutoSize:=False;
WordWrap:=True;
//Font.Color:=$000000;
//Font.Style:=[fsBold];
//Font.Size:=10;
Parent:=WizardForm;
Transparent:=True;
Caption:= 'Программа ' + ExpandConstant('{#AppName}') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
end;
end;
end;
end;
procedure InitializeWizard;
begin
NewForm;
end;
//************************************** Четыре кнопки **************************************
3. Вопрос
Как сделать так чтобы при установки определялась версия Net.Framework 3.5, если он не установлен, то сначало устанавливался Net.Framework 3.5 из папки Others, а потом продолжалася установка, если установлен то продолжал установку?
R.i.m.s.k.y.
06-12-2011, 08:12
Как сделать так чтобы при установки определялась версия Net.Framework 3.5, если он не установлен, то сначало устанавливался Net.Framework 3.5 из папки Others, а потом продолжалася установка, если установлен то продолжал установку? »
function netfw35(): Boolean;
begin
if ( RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5') ) then Result := True else Result := False;
end;
Function InitializeSetup: Boolean;
var res, i : Integer;
Begin
result:=true;//шоп не закрылся инсталлер
if (not netfw35) then begin
MsgBox('Net.Framework 3.5 не найден, нажмите ОК для установки', mbInformation, MB_OK);
Exec(ExpandConstant('{src}\Others\dotnet35.exe'), ' /q /passive /norestart',ExpandConstant('{src}\Others\'),SW_show, ewWaitUntilTerminated, res);
result:=true;//шоп не закрылся инсталлер
end;//if (not netfw35)
end; //InitializeSetup
Devils Night
06-12-2011, 12:27
R.i.m.s.k.y., это я закоментировал result:=true;//шоп не закрылся инсталлер, чтоб закрывался, потому не нужно чтобы устанавливался без Framework-а, и нужно вот что, чтобы установка дожидалась пока установится Framework, и как Framework установится то продолжалась основная установка!?
R.i.m.s.k.y.
06-12-2011, 12:39
чтоб закрывался, потому не нужно чтобы устанавливался без Framework-а, и нужно вот что, чтобы установка дожидалась пока установится Framework, и как Framework установится то продолжалась основная установка!? »
ewWaitUntilTerminated указывает, что инсталлер будет ждать пока не поставится фреймворк
тебе надо чтобы закрылся или чтобы поставил фреймворк и продолжил?
вверху - поставит и продолжит
если хочешь чтобы закрылся - убери Exec и исправь
if (not netfw35) then begin
...
result:=false;
...
кстати зря закомменил "шоп не закрылся инсталлер", если какой-то шаг вернет false в результате ошибки вызова, то без этой строчки InitializeSetup тоже может получить на выходе false и инсталлер закроется
ворчание моде он
народ, где вы так писать научились, а? зато никто не забывает попинать бабу-ЕГЭ
книжки бы хоть почитали, грамотные, как предложения строятся, как мысль из мозга переносится на бумагу/клавиатуру
хотя если учесть, что написанная мысль - есть мысль измышленная, я даже боюсь представить что там измышляется :)
TROY Diamond
07-12-2011, 18:49
Помогите, пожалуйста, доработать, исправить, "усовершенствовать" скрипт!
Или поделитесь какими-нибудь другими кодами создания индикаторов процесса "для секции [Run]"
ПРОБЛЕМА: Индикатор работает НЕ на всех темах!!!
[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion
[Code]
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
const
PBM_SETMARQUEE = $040A;
GWL_STYLE = -16;
PBS_MARQUEE = $08;
var
AnimatePb: TNewProgressBar;
procedure CreateAnimatePb;
begin
AnimatePb := TNewProgressBar.Create(WizardForm);
with AnimatePb do
begin
Parent := WizardForm.InstallingPage;
SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10),
WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
SetWindowLong (AnimatePb.Handle, GWL_STYLE, (GetWindowLong (AnimatePb.Handle, GWL_STYLE) or PBS_MARQUEE));
SendMessage(AnimatePb.Handle, PBM_SETMARQUEE, 1, 20);
end;
end;
procedure AnimatePbMsg(const msg: string);
begin
if AnimatePb = nil then
CreateAnimatePb;
WizardForm.FilenameLabel.Caption := msg;
end;
procedure AnimatePbFree;
begin
if AnimatePb <> nil then
begin
AnimatePb.Free;
AnimatePb := nil;
end;
end;
[Run]
Filename: {app}\MyProg.exe; BeforeInstall: AnimatePbMsg('Создание файла...'); Flags: skipifsilent
Filename: {app}\MyProg2.exe; BeforeInstall: AnimatePbMsg('Создание файла...'); Flags: skipifsilent
Filename: {app}\MyProg3.exe; BeforeInstall: AnimatePbMsg('Создание файла...'); AfterInstall: AnimatePbFree; Flags: skipifsilent
ПРОБЛЕМА: Индикатор работает НЕ на всех темах!!!
А также:
1. Нужно поднять индикатор выше, чтобы он был на том же самом месте, что и оригинальный и выглядел также.
2. Убрать сообщения, т.к. я использую "StatusMsg", а если не использовать, то появится сообщение "Завершение установки"
3. Сделать кнопку "Отмена" активной и вернуть возможность прерывания процесса установки.
Если нельзя ничего этого сделать, поделитесь какими-нибудь другими кодами создания индикаторов процесса "для секции [Run]"
У меня из секции [Run], выполняется ещё куча команд в скрытом режиме, которая занимает довольно много времени, поэтому нужна какая-то индикация...
ИЛИ МОЖЕТ ЕСТЬ КАКОЙ-НИБУДЬ ДРУГОЙ СПОСОБ, для запуска и выполнения дополнительных операций, во время и/или после установки, НЕ обязательно из секции [Run] со стандартной индикацией процесса?!
Devils Night
08-12-2011, 07:46
чтобы поставил фреймворк и продолжил? »Именно это надо.
кстати зря закомменил "шоп не закрылся инсталлер" »А когда не убран, он всё равно продолжает установку, даже если фреймворк не установлен.
убери Exec и исправь
if (not netfw35) then begin
...
result:=false;
... »Насчёт этого, я тугой вообще, туго соображаю.
TROY Diamond
08-12-2011, 16:13
Посмотрите, пожалуйста, мой скрипт, - проверьте, исправьте если, что нужно и скажите, что да, как!
За гламуром вообще НЕ гонюсь... наоборот, всё должно быть компактно, аккуратно и близко к оригиналу...
http://rghost.ru/33759851
Если есть более, простой способ всех проведённых мною манипуляций, то подскажите, пожалуйста!
А также, посоветуйте, пожалуйста, насчёт индикатора процесса...
И вообще, что касается выполнения большого количества каких-либо операций во время и/или после установки, как это лучше реализовать?
Можно ли сделать кнопку "Отмена" активной и/или выполнять это всё не из секции [Run]?!
А последнее по поводу "runascurrentuser" нужно, чтобы все команды выполнялись с правами Администратора!
TROY Diamond
08-12-2011, 17:17
Как использовать *.png или *.gif картинку в WizardSmallImageFile и WizardImageFile, вместо *.bmp
Vista-w,
на сколько я знаю-ботва не работает с *.gif
No4noylis
08-12-2011, 22:44
ARS_23, Inno GIFCtrl не поможет???
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.