Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
Установщик родной Sandboxie отнюдь не Inno, а NSIS. »Если родной установщик от NSIS, то какие могут быть претензии к Inno?
Добавляю только параметр /S и ноу проблем-с, тихое удаление. »
У NSIS "/S" и в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall есть такое как Sandboxie, но к Inno это отношения вообще не имеет.
У Inno "/SILENT" а в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall к Sandboxie дописывается хвост "_is1".
El Sanchez
18-04-2014, 15:50
Извлекаем параметр в интерпретатор командной строки, и получаем требуемый результат. Другого способа не нашел. »
Stealthmax, разделить полученную из реестра строку на путь к программе и параметры можно так:
#define A = (Defined UNICODE) ? "W" : "A"
type
CMDLINE = record // user defined
szProg: String;
szParams: String;
end;
procedure PathRemoveArgs(pszPath: String); external 'PathRemoveArgs{#A}@shlwapi.dll stdcall';
////////////////////////////////////////
function argv(szCLine: String): CMDLINE;
begin
PathRemoveArgs(szCLine);
StringChangeEx(szCLine, #0, #13#10, True);
with TStringList.Create do
try
Text := szCLine;
if Count > 0 then Result.szProg := Strings[0];
if Count > 1 then Result.szParams := Strings[1];
finally
Free;
end;
end;
/////////////////////////////
procedure InitializeWizard();
var
szCLine: String;
cl: CMDLINE;
begin
szCLine := '"C:\Windows\Inst aller\SandboxieInstall64.exe" /remove /fdfdfg -gggg "ghfhg fhg" 123';
cl := argv(szCLine);
MsgBox(Format('Program: %s'#13#10'Command Line: %s', [cl.szProg, cl.szParams]), mbInformation, MB_OK);
end;
ROMKA-1977
18-04-2014, 18:27
Подскажите как в ISDone правильно указать пароль архива FreeArc ? Делаю как показанно в инструкции но во время распаковки вылетает ошибка:
Произошла ошибка при распаковке: Неверный пароль!
Unarc.dll вернул код ошибки: -13
ERROR: wrong password
Пароль указал тот же что и при архивации.
Пример:
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\Data-1.arc'), ExpandConstant('{app}\'), '', false, '1234', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
audiofeel
18-04-2014, 18:49
ROMKA-1977, Unarc.dll от фри арка ( тем чем сжимаеш) замени на тот что в скрипте
ROMKA-1977, Пакуй так:
start /wait arc.exe a -ep1 -dses --dirs -s; -lc- -di -i2 -r -p1234 -m=lzma:a1:mfbt4:d128m:fb128:mc1000:lc8 data\data-1.arc packeddata\*
Распаковка так:
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '1234', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
Все необходимое:http://rghost.ru/54360629
Stealthmax
19-04-2014, 04:39
У NSIS "/S" и в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall есть такое как Sandboxie, но к Inno это отношения вообще не имеет.
У Inno "/SILENT" а в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall к Sandboxie дописывается хвост "_is1". »
Ну то понятно, я делал репак программы, и нужна была проверка не предмет оригинальной установки и, допустим, наличие установки на базе Inno, так вот с Inno как раз проблем никаких, даже при обработке моего ключа для удаления в реестре вида: RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}_is1','UninstallString', ExpandConstant('{app}\{#UninstallExeName} /VERYSILENT /NORESTART /SUPPRESSMSGBOXES'));, а с оригинальным установщиком возникла трабла, вот и всего-то. Но ещё раз спасибо всем, кто не прошел мимо и активно оказал содействие.
Нашел код для определения локали в таком формате 1049 и добавил в свой код при деинсталляции:
type
LCID = LongInt;
function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultCode: Integer;
begin
if CurUninstallStep=usUninstall then
begin
Exec(ExpandConstant('{app}\KmdUtil.exe'),ExpandConstant(' /lang=LCID stop SbieSvc'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
Exec(ExpandConstant('{app}\KmdUtil.exe'),ExpandConstant(' /lang=LCID delete SbieSvc'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
Exec(ExpandConstant('{app}\KmdUtil.exe'),ExpandConstant(' /lang=LCID stop SbieDrv'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
Exec(ExpandConstant('{app}\KmdUtil.exe'),ExpandConstant(' /lang=LCID delete SbieDrv'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
end;
end;
Суть сводится к тому, что не требуется перезагрузка при удалении драйвера, в штатном комплекте Sandboxie идет исполняемый модуль для установки/удаления службы и драйвера, пробовал использовать sc.exe для подобного, но требуется в итоге перезагрузка. Данный вариант зарекомендовал себя отлично, т.е. прогнал 3 раза переустановку смешанную туда-сюда, все работает. Вопрос такой: правильно ли я употребил WinAPI в данном контексте? У разработчика выглядит так: {tmp}\KmdUtil.exe /lang=1049 stop SbieDrv применимо для русской локали.
Dinvin4ester
19-04-2014, 09:20
Ребята как сделать процентный прогресс бар ?
audiofeel
19-04-2014, 14:44
Ребята как сделать процентный прогресс бар ? »
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program
[Files]
Source: files\*; DestDir: {app}; AfterInstall: ExtLog(); Flags: recursesubdirs
[Code]
var
ProgressLabel: TLabel;
procedure ExtLog();
begin
with WizardForm.ProgressGauge do begin
ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%'
if (Position-Min)/((Max - Min)/100) > 50 then ProgressLabel.Font.Color:= clWhite
end
end;
procedure InitializeWizard;
begin
ProgressLabel:=TLabel.Create(WizardForm)
ProgressLabel.Top:= 4
ProgressLabel.Left:= 200
ProgressLabel.Caption:= '0%'
ProgressLabel.AutoSize:= True
ProgressLabel.Font.Color:= clBlue
ProgressLabel.Font.Style:= [fsBold]
ProgressLabel.Transparent:= True
ProgressLabel.Parent:= WizardForm.ProgressGauge
end;
НЕ ??
Dodakaedr
19-04-2014, 17:08
Можно свои ключи для командной строки придумать в Inno?
Stealthmax
19-04-2014, 17:28
Можно свои ключи для командной строки придумать в Inno? »Частично, вот примеры: 1 (http://forum.oszone.net/post-2332104-218.html), 2 (http://forum.oszone.net/post-2153695-517.html), 3 (http://forum.oszone.net/post-2279192-1780.html). По аналогии можно и другие ключи делать, поищи на форуме, а также в справке есть (http://www.jrsoftware.org/ishelp/index.php?topic=setupcmdline).
Dodakaedr
19-04-2014, 17:31
Stealthmax, Как создать ключи для: Не создавать ярлык на рабочем столе, Не создавать ярлык в меню «Пуск»?
Stealthmax
19-04-2014, 18:19
Как создать ключи для: Не создавать ярлык на рабочем столе, Не создавать ярлык в меню «Пуск»? »
Ну все по той же схеме, что в примерах выше. Либо кастомные ключи делаешь для каждого чекбокса или используешь секцию Tasks.
[Icons]
//здесь открепляем ярлыки от привязки к общей группе {group}
//{commonprograms}- общая для всех пользователей папка в меню Пуск
//{userprograms}- для отдельного пользователя в меню Пуск
Name: "{commonprograms}\{#MyAppName}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: StartMenu
Name: "{commonprograms}\{#MyAppName}\{cm:VisitSiteProduct,{#MyAppName}}"; Filename: "{#MyAppURL}"; Check: UrlMenu
Name: "{commonprograms}\{#MyAppName}\{cm:Uninstall} {#MyAppName}"; Filename: "{app}\{uninstallexe}"; Check: UninstallMenu
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: Desktop
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: QuickStart
[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[CustomMessages]
Russian.VisitSiteProduct=Посетить сайт продукта
Russian.Uninstall=Удалить
[_Code]
var
startmenu1 : boolean;
function StartMenu: Boolean;
begin
Result := StartMenuRadioButton.Checked or startmenu1;
end;
Function InitializeSetup: Boolean;
var
i : integer;
Begin
for i:=2 to ParamCount do begin
if ( Pos(LowerCase('/startmenu'), Lowercase(ParamStr(i))) > 0 ) then startmenu1 := true else startmenu1 := false; //назначаем ключ для выполнения задачи
Result := True;
end;
end;
Если будешь использовать по отдельности для каждого ярлыка, то например, при наличием {group} будет игнорироваться состояние чекбокса, тут думаю понятно почему.
В этом примере самый простой способ. Используются ключи из справки: /TASKS="startmenu,urlmenu,uninstallicon,desktopicon,quicklaunchicon", либо так /COMPONENTS="component1,component2", чтобы не создавать /TASKS="!startmenu,!urlmenu,!uninstallicon,!desktopicon,!quicklaunchicon"- восклицательный знак перед именем задачи[Icons]
Name: "{commonprograms}\{#MyAppName}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: startmenu
Name: "{commonprograms}\{#MyAppName}\{cm:VisitSiteProduct,{#MyAppName}}"; Filename: "{#MyAppURL}"; Tasks: urlmenu
Name: "{commonprograms}\{#MyAppName}\{cm:Uninstall} {#MyAppName}"; Filename: "{app}\{#uninstallexe}"; Tasks: uninstallicon
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "startmenu"; Description: "{#MyAppName}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "urlmenu"; Description:"{cm:VisitSiteProduct,{#MyAppName}}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "uninstallicon"; Description: "{cm:Uninstall,{#MyAppName}}"; GroupDescription: "{cm:AdditionalIcons}";
[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"
[CustomMessages]
Russian.VisitSiteProduct=Посетить сайт продукта
Russian.Uninstall=Удалить
Russian.CreateDesktopIcon=Создать ярлык на рабочем столе
Russian.CreateQuickLaunchIcon=Добавить ярлык в панель Быстрого запуска
Stealthmax, Если предоставляешь код, то предоставляй рабочий вариант - чтоб за тебя никто не допиливал. Директив, CustomMessages и прочего тоже касается.
Например в Inno нет такого: {cm:Uninstall}; есть {cm:UninstallProgram,My Program}.
Stealthmax
19-04-2014, 21:30
Если предоставляешь код, то предоставляй рабочий вариант - чтоб за тебя никто не допиливал. Директив, CustomMessages и прочего тоже касается.
Например в Inno нет такого: {cm:Uninstall}; есть {cm:UninstallProgram,My Program}. »Здрасти, приехали. А может сразу тогда выкладывать скрипт по заявке? Тут вроде не стол заказов, а сообщество, где обмениваются опытом. А что касаемо Russian.isl, входящего в состав Inno, то это изврат на мой взгляд, мне не нравится, правлю под себя. И самое главное: если непонятно, то личка открыта, всегда пожалуйста или же прям здесь, меня не затруднит пояснить, а в данном конкретном случае попытался помочь человеку насколько это зависело от моего времени и возможностей. Я тоже с паскалем не родился в одном месте, делюсь знаниями, сам черпаю здесь многое для себя. Здесь есть умнее меня намного, но я их стараюсь не задалбывать вопросами из области элементарного, скорее где наверняка не понимаю. Так что претензия необоснованна в мой адрес.
P.S. Извиняй, если резко выразился. Человек не понял, не получилось, сразу мне отписал, решаем в личке.
Тут вроде не стол заказов »Но и не помойка. Данный раздел имеет тематический характер. Любой совет должен иметь содержательную информацию. Если такового не имеется - то и смысла писать нет вообще.
А что касаемо Russian.isl, входящего в состав Inno, то это изврат на мой взгляд »
Что именно здесь:
[Setup]
AppName=My Program
AppVersion=1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:ProgramOnTheWeb,My Program}; Filename: http://www.example.com
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program; Filename: {app}\MyProg.exe
находите под словом "изврат"?
Это самый простой и стандартный пример: который компилится даже в том случае, если и вовсе не имеется секции [Languages] - быть точнее:
[Languages]
Name: default; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
мне не нравится, правлю под себя. »Правьте, ваше право. Но не нужно думать что все расчёсываются вашей расчёской.
а в данном конкретном случае попытался помочь человеку »Но нужно и наглядно показать наверно? Не понимаю как так выкладывать код не проверив. Кинуть огрызком кода который не может быть воспроизведён у другого человека - это не помощь, а создание геморроя.
решаем в личке. »А что в личке? Ведь выложил же в том месте, где видно - значит им может полюбопытствовать любой желающий. Если вас сильно тяготит дать полный ответ, то конечно целесообразнее было вам помочь человеку в PM, чем потом здесь оправдываться.
Представим что этот код может заинтересовать новичка (кодеру то понятно - это как семечки лузгать) - но при попытке воспроизвести этот код выдаст ошибку "[ISPP] Undeclared identifier: "MyAppName""
при исправлении, а точнее при добавлении директивы #define со значениями.
Выскочит ещё одна ошибка, например "A custom message named "VisitSiteProduct" has not been defined. (и т.п.)"
потом "Required function or procedure 'StartMenu' not found."
наконец "Unknown identifier 'StartMenuRadioButton'" (и т.п.).
и это вместо того, чтоб один раз - дать полный ответ.
Сами же напарываетесь, а потом: "Не работает" или "Дали кривой код" и т.п.
Заметь, не все понимают что половина ответов содержится в справке.
Каждый по своему понимает. Каждый по своему делает. Но результат выходит один. Не важно каким именно способом проделан результат - важно что он работает правильно и без ошибок.
Не сделали никакого вывода - "тогда Ой".
ROMKA-1977
20-04-2014, 13:31
Заметил такую особенность в ISDone: на странице распаковки файлов кнопка закрытия окна не работает хотя и кликабельна. Возможно ли наложить на неё функцию кнопки "отмена распаковки" или сделать неактивной как на странице завершения установки ?
Stealthmax
20-04-2014, 23:59
Сами же напарываетесь, а потом: "Не работает" или "Дали кривой код" и т.п. » Не вопрос, сейчас доделаю третий вариант с ключами и исправлю свой пост с исчерпывающими(рабочими) примерами на суд знатоков и начинающих, и надеюсь, что будет внесено в шапку. Заметь, не все понимают что половина ответов содержится в справке. » Ну это тоже верно, все ж хотят быстро и сразу, а так не бывает.
audiofeel
21-04-2014, 09:29
Возможно ли наложить на неё функцию кнопки "отмена распаковки" »
http://krinkels.org/attachments/isdone-0-6final-for-freearc-alpha-2012-7z.1429/
ты попробуй запустить скрипт ISDone_Example2.iss, все работает!!!
Dodakaedr
21-04-2014, 17:03
В скрипте используется такой msg procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
MessageBox(Application.Handle, 'Приятного использования!', '{#MyAppName}', MB_OK or $40);
end; и он появляется когда используется тихая установка. Как сделать так чтобы только при тихой установке оно не появлялось??
Dodakaedr, попробуйте так
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
if not WizardSilent then
MessageBox(Application.Handle, 'Приятного использования!', '{#MyAppName}', MB_OK or $40);
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC