Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
pollipen
19-02-2019, 09:10
парни подскажите, как сделать что бы после установки в тихом режиме с ключом (/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-) программа не запускалась?
потому что там стоит галачка
https://c.radikal.ru/c04/1902/5e/28a6c9832fa1.png
El Sanchez
19-02-2019, 09:51
как сделать что бы после установки в тихом режиме с ключом (/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-) программа не запускалась?
потому что там стоит галачка »
pollipen, в скрипте флаг skipifsilent выставлен, запускаться не должна.
pollipen
19-02-2019, 10:20
нет всё равно запуск идёт программы
mariolast
24-02-2019, 22:57
Есть пример скрипта для обработки своих параметров при установке через /silent?
Скажем /1 задает одни умолчальные параметры чекбоксов, /2 другие.
Давно уже не занимался Inno
Всем привет. Кто может помочь, как снять обводку с кнопок. В скриптинге нуб:)
https://picua.org/images/2019/03/01/6ff9c76cc52f305c12cc9b1e58cdde1e.jpg
Вот архив с скриптом. http://rgho.st/6hwhMlbnC
FiRmaN, значит, пора учиться.
FiRmaN, значит, пора учиться. »
Есть материал где можно прочесть как убрать эту обводку?
как убрать эту обводку? »
Пример:
[Code]
procedure InitializeWizard();
begin
WizardForm.NextButton.Default := False;
end;
А также (Вдруг тоже приспичит):
[Code]
procedure InitializeWizard();
begin
WizardForm.GroupEdit.AutoSelect := False;
WizardForm.NextButton.AutoSelect := False;
end;
Дальше сами.
habib2302
03-03-2019, 21:01
Доброе время суток. Нужно, чтобы при выборе или отмене компонента и задачи добавлялась или удалялась часть команды из секции run?
Например: При выборе задачи "Создать ярлык на РС" добавлялась команда SHORTCUT_DESKTOP=1.
[Run]
Filename: msiexec.exe; Parameters: "/I Setup.msi /qf ALL_USERS=1 SHORTCUT_DESKTOP=1 INSTALLDIR=""{app}"""; Check: not WizardSilent; Flags: waituntilterminated hidewizard;
habib2302, нет, нельзя. Файл инсталляции формируется в момент его создания. Работайте с набором задач, для которых будут разные параметры у исполняемой команды, либо работайте непосредственно в коде.
P.S. Я надеюсь, Ваша инсталляция не состоит только из одного этого файла?
habib2302
03-03-2019, 22:46
либо работайте непосредственно в коде »
В принципе я надеялся на помощь т.к я в коде не силен. (Если есть возможность сделать код)
P.S. Я надеюсь, Ваша инсталляция не состоит только из одного этого файла? »
Нет
Например: При выборе задачи "Создать ярлык на РС" добавлялась команда SHORTCUT_DESKTOP=1. »
[Tasks]
Name: DesktopIcon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
[Run]
Filename: {sys}\msiexec.exe; Parameters: "/I Setup.msi /qf ALL_USERS=1 SHORTCUT_DESKTOP=1 INSTALLDIR=""{app}"""; Check: not WizardSilent; Flags: waituntilterminated hidewizard; Tasks: DesktopIcon
Filename: {sys}\msiexec.exe; Parameters: "/I Setup.msi /qf ALL_USERS=1 INSTALLDIR=""{app}"""; Check: not WizardSilent; Flags: waituntilterminated hidewizard; Tasks: not DesktopIcon
В зависимости от выбора или не выбора задачи (по умолчанию не выбрано, флаг 'unchecked'), будет выполняться только один из указанных запусков (по умолчанию без параметра 'SHORTCUT_DESKTOP=1'). С компонентом можно сделать аналогично.
habib2302
04-03-2019, 02:15
boss911, помимо ярлыков на рс есть 4 компонента и ярлык в пуск
Начинают выясняться интересные подробности…
boss911, помимо ярлыков на рс есть 4 компонента и ярлык в пуск »
habib2302, о которых мы, конечно, должны были догадаться? Вы написали конкретный пример «например» — Вам дали на него конкретный ответ. Хотите чего-то сложного с кучей условий и зависимостей — изучайте и берите в руки PascalScript.
habib2302
04-03-2019, 04:30
Iska, уже сделал. посредством записи команд в ini файл через секцию [Ini] и чтение из ini файла через код
OldGamer
05-03-2019, 22:39
Ребята, подскажите пожалуйста, как можно изменить стандартное окно с выбором языков установки?
Чтобы было похоже на то, что во вложении.
usermode
08-03-2019, 20:36
помогите забороть странный колбек:
[Setup]
AppName=DeltaMAX
AppVerName=DeltaMAX 2.0.1.0
DefaultDirName={tmp}
OutputDir=c:\Files\
[Code]
type
EnumCallback=procedure(retcode: integer;lpUser:Longint);
function WrapMyCallback(callback:EnumCallback; paramcount:integer):longword;
external 'wrapcallback@{sd}\Files\innocallback.dll stdcall';
type
DELTAMAX_ENCODE_OPTIONS = record
lpszLicensedTo: ansistring;
lpszLicenseKey: ansistring;
nMemoryMax: Integer;
nMemoryMaxPercent: Integer;
nFreeMemoryMin: Integer;
nLowMemMode: Integer;
nFootprintSize: Integer;
bAutoIncreaseFootprintSize: bool;
bEnableMultiPass: bool;
nMultiPassThreshold: Integer;
nMultiPassMaxAdditionalPasses: Integer;
pProgressCallback: longword;
lpUserData: integer;
end;
procedure DeltaMAXInitEncodeOptions(pOptions: DELTAMAX_ENCODE_OPTIONS);
external 'DeltaMAXInitEncodeOptions@{sd}\Files\DeltaMAX.dll cdecl';
function DeltaMAXEncode(szSource: ansistring; szTarget: ansistring; szDiff: ansistring; pOptions: DELTAMAX_ENCODE_OPTIONS): Integer;
external 'DeltaMAXEncode@{sd}\Files\DeltaMAX.dll cdecl';
procedure ProcessDiff(code: integer; lpUser:Longint);
begin
MsgBox('data', mbError, MB_OK);
end;
var
Data: PAnsiChar;
Options: DELTAMAX_ENCODE_OPTIONS;
callback:longword;
userdata:ansistring;
function initializesetup():boolean;
var
err: Integer;
n,s: ansistring;
begin
callback:=WrapMyCallback(@ProcessDiff,2);
n := 'DEMO';
s := 'DEMO';
DeltaMAXInitEncodeOptions(Options);
Options.lpszLicensedTo := n;
Options.lpszLicenseKey := s;
Options.nMemoryMax := 0;
Options.nMemoryMaxPercent := 80;
Options.nFreeMemoryMin := 8;
Options.nLowMemMode := 1;
Options.nFootprintSize := 0;
Options.bAutoIncreaseFootprintSize := true;
Options.bEnableMultiPass := false;
Options.nMultiPassThreshold := 0;
Options.nMultiPassMaxAdditionalPasses := 1;
//Options.lpUserData := 0;
//Options.pProgressCallback := callback;
err := DeltaMAXEncode('D:\1.txt', 'D:\2.txt', 'D:\patch.diff', Options);
if err <> 0 then
MsgBox('Bad! ' + IntToStr(err), mbError, MB_OK) else
MsgBox('Success! ' + IntToStr(err), mbError, MB_OK);
end;
сам sdk в аттаче. нужно, чтобы в структуре параметр pProgressCallback корректно исполнял колбек для обсчета процентов согласно документации SDK. полагаю, у меня ошибка в данных lpUserData, я не знаю какой указатель и куда должен быть использован.
для использования надо из папки SDK\Redist скопировать ANSI версию DeltaMAX.dll в C:\Files, туда же InnoCallback.dll.
также нужно поместить 1.txt и 2.txt с различающимися данными. D:\patch.diff - сюда будут записаны файл с изменениями.
из соображений копирайтов, серийный номер не прикладываю, нужно будет подождать пять секунд и нажать OK для запуска процесса.
El Sanchez
10-03-2019, 12:17
помогите забороть странный колбек »
usermode,
[Setup]
AppName=DeltaMAX
AppVerName=DeltaMAX 2.0.1.0
DefaultDirName={tmp}
OutputDir=.
[Files]
Source: {#ifdef UNICODE}Unicode\{#endif}DeltaMAX.dll; Flags: dontcopy;
Source: InnoCallback.dll; Flags: dontcopy
[Code]
type
TMessageCallback = function(nMessageCode: Integer; lpUserData: LongWord): BOOL;
TProgressCallback = function(dPercentDone: Single; lpUserData: LongWord): BOOL;
TDeltaMAXEncodeOptions = record
lpszLicensedTo: string;
lpszLicenseKey: string;
nMemoryMax: Integer;
nMemoryMaxPercent: Integer;
nFreeMemoryMin: Integer;
nLowMemMode: Integer;
nFootprintSize: Integer;
bAutoIncreaseFootprintSize: BOOL;
bEnableMultiPass: BOOL;
nMultiPassThreshold: Integer;
nMultiPassMaxAdditionalPasses: Integer;
pProgressCallback: LongWord;
pMessageCallback: LongWord;
lpUserData: LongWord;
end;
function WrapMessageCallback(Callback: TMessageCallback; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function WrapProgressCallback(Callback: TProgressCallback; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure DeltaMAXInitEncodeOptions(var pOptions: TDeltaMAXEncodeOptions); external 'DeltaMAXInitEncodeOptions@files:DeltaMAX.dll cdecl';
function DeltaMAXEncode(szSource, szTarget, szDiff: string; var pOptions: TDeltaMAXEncodeOptions): Integer; external 'DeltaMAXEncode@files:DeltaMAX.dll cdecl';
function ProgressCallback(dPercentDone: Single; lpUserData: LongWord): BOOL;
begin
Result := True;
Log(Format('Progress: %n%%', [dPercentDone]));
end;
function MessageCallback(nMessageCode: Integer; lpUserData: LongWord): BOOL;
begin
Result := True;
Log(Format('Message code: %d', [nMessageCode]));
end;
function InitializeSetup: Boolean;
var
LOptions: TDeltaMAXEncodeOptions;
LResultCode: Integer;
begin
try
DeltaMAXInitEncodeOptions(LOptions);
LOptions.lpszLicensedTo := 'DEMO';
LOptions.lpszLicenseKey := 'DEMO';
LOptions.bEnableMultiPass := False;
LOptions.nMultiPassThreshold := 0;
LOptions.nMultiPassMaxAdditionalPasses := 1;
LOptions.pProgressCallback := WrapProgressCallback(@ProgressCallback, 2);
LOptions.pMessageCallback := WrapMessageCallback(@MessageCallback, 2);
LResultCode := DeltaMAXEncode(ExpandConstant('{src}\1.txt'), ExpandConstant('{src}\2.txt'), ExpandConstant('{src}\patch.diff'), LOptions);
if LResultCode <> 0 then
RaiseException(Format('Encode failed with error code: %d', [LResultCode]));
except
ShowExceptionMessage;
finally
end;
usermode
10-03-2019, 15:02
El Sanchez, благодарю! :victory:
Давно не кодил и ошибка основная у меня была в том, что я полностью не описал структуру, почему то решил, что можно некоторые параметры не описывать и оставить себе только нужные - а так делать нельзя, такое можно только в коде функции. К тому же не выполнил главного условия True функции колбека, без которого это дело тоже не заведется. Также прошляпил var в прототипах, хотя использовал почему-то out и работало..
Вопрос у меня следующий, проценты выполнения привязаны только к прогресс бару? Вообще я хотел бы адаптировать под консольное приложение на дельфи и мне там было бы неплохо прогресс выполнения привязать к строке, отображающей проценты в числовом виде. Пока не могу придумать как описать проценты от 0 до 100 в ProgressCallback, ибо даже если вручную указать min 0, max 100, step 1, то общее количество вызовов в колбеке мы не знаем, их может быть 250, 400 и т.д.
по идее в dPercentDone должно лежать число максимального цикла колбека, чтобы выполнить обсчет процентов? может быть потому что другой тип данных Single, а не Double? а с Double работать не хочет. надо будет с дельфи повозиться, посмотреть как там дела будут обстоять с Double.
добавлено
вобщем, проблема решена на дельфи:
function DiffProgressCallback(nn:double; lpUserData:pointer): bool; stdcall;
begin
Application.ProcessMessages;
Form1.edt1.Text := IntToStr(round(nn));
Form1.pb1.position:=round(nn);
Result:=True;
end;
double нормально отрабатывает, только сначала не понял, почему по третьему кругу прогресс бар и проценты идут. оказалось, так надо :) разные этапы так разделяются.
я проверил код на Inno и на Delphi, что-то типа:
ppos:=0;
...
в колбеке:
inc(ppos);
и считаем проценты по ppos, минусуя 100 процентов при превышении интервала.
сравнив выполнение с double на дельфи и там же рядом inc кода на Inno - абсолютно одинаково считает, единственное на Inno надо учитывать "переполнение" счетчика процентов, когда идет вторая и третяя стадия выполнения. извращаться с Single в данном случае не обязательно :)
El Sanchez
10-03-2019, 19:18
Также прошляпил var в прототипах, хотя использовал почему-то out и работало.. »
usermode, в данном случае без разницы.
Вопрос у меня следующий, проценты выполнения привязаны только к прогресс бару? »
usermode, прогресс там привязан к разным операциям в течении сессии. Запустите Bin\MFC60Client.exe и увидите, что прогресс там несколько раз полностью доходит до конца, общего нет.
по идее в dPercentDone должно лежать число максимального цикла колбека, чтобы выполнить обсчет процентов? может быть потому что другой тип данных Single, а не Double? а с Double работать не хочет. надо будет с дельфи повозиться, посмотреть как там дела будут обстоять с Double. »
usermode, нормально в Delphi должно быть, это в PascalScript флоаты дурные. Single я поставил, потому что с другими типами ошибки, с ним же без ошибок, но проценты не считает :).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.