Member 12983131 Ответов: 1

Как определить, полностью ли(на 100%) завершена настройка silent inno простым способом?


Когда файлы блокируются во время автоматической установки Inno(фактически обновления), пользователь получает MsgBox, позволяющий ему игнорировать замену файлов. После завершения установки процесс существует с ExitCode=0, что означает завершение установки. Поскольку не все файлы заменяются, вы не можете быть на 100% уверены, что установка полностью завершена.

ОБНОВЛЕНИЕ:
Спасибо Валерий, к сожалению, Ваш ответ не может решить мою проблему, так как MakePendingFileRenameOperationsChecksum возвращает одну и ту же контрольную сумму до и после обновления части! Это происходит, если PrivilegesRequired имеет значение lowest, а не admin?

Потратив некоторое время на кодирование методом проб и ошибок, я обнаружил, что при использовании переключателя /SUPPRESSMSGBOXES возвращаемый код выхода равен 5(Настройка прервана)! Этого мне вполне достаточно!

Что я уже пробовал:

* поиск какой-либо функции или переменной в API настройки Inno, чтобы проверить, завершена ли она на 100%.;
* проверка кодов выхода;
* поиск в гугле;
* сравнение контрольных сумм всех файлов до и после установки(слишком много работы);
* замена кодирования в самой установке, чтобы иметь больше контроля(слишком много работы);

1 Ответов

Рейтинг:
2

Valery Possoz

Привет,

В прошлом я делал это с помощью

MakePendingFileRenameOperationsChecksum
и возвращает пользовательский код ошибки.

Если файл используется и пользователь выбирает игнорировать, то Inno setup установит флаг ожидания перезагрузки.

Пример сценария:

Source: "MyProg.exe"; DestDir: "{app}";
Source: "MyProg.chm"; DestDir: "{app}"; Flags: restartreplace;
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme;

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
var
  Restarted: Boolean;
  ChecksumBefore: String;
  ChecksumAfter: String;

procedure ExitProcess(exitCode:integer);
  external 'ExitProcess@kernel32.dll stdcall';

procedure ReturnRebootNecessary();
begin
    ExitProcess(9); //Custom exit code
end;

function InitializeSetup(): Boolean;
begin
    ChecksumBefore := MakePendingFileRenameOperationsChecksum;
    Result := True;
end;

procedure DeinitializeSetup();
begin
    ChecksumAfter := MakePendingFileRenameOperationsChecksum;
    if ChecksumBefore <> ChecksumAfter then
    begin
         ReturnRebootNecessary();
    end;
end;


Спасибо.