как завершить установщик, если удаление устаревшей версии программного обеспечения отменено до его запуска?

Я создал установщик (myinstaller), используя innosetup для установки приложения (myapp). Фрагмент кода:

function legacy_check(): Boolean;
    begin
       ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
       Result := True; 
    end;

function InitializeSetup(): Boolean;
    begin                                  
       Result:=legacy_check(); // after this line only inno setup wizard page will appear 
       // code to install latest version 
     end;

Здесь функция legacy_check() проверяет наличие старой версии myapp в системе, удаляет ее и возвращает значение true . чтобы myinstaller мог продолжить работу.

Но здесь при удалении старой версии он спрашивает пользователя, удалять или нет. В этот раз, если пользователь нажимает «ОК» для удаления, все работает нормально. Но если пользователь нажимает «Отмена», чтобы удалить старую версию, он должен завершить работу myinstaller. Но это не завершение, поскольку он все равно возвращает True.

Поэтому я думаю, что мне нужно получить код возврата, когда пользователь нажимает кнопку отмены для удаления, чтобы с помощью кода возврата я мог вернуть либо true, либо false.

Итак, есть ли способ получить код возврата, когда пользователь нажимает «Отмена» для удаления, чтобы я мог использовать его после строки,

ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);  ?

в противном случае, пожалуйста, скажите мне, как удалить его молча. Я не понимаю, как использовать параметр /SILENT в ShellExec, поскольку параметры уже присутствуют. Поэтому, пожалуйста, предложите мне какую-нибудь идею.


person beginner    schedule 10.10.2014    source источник
comment
О, снова этот установщик ClickOnce (вызывается rundll). Был задан вопрос о том, как автоматически удалить развернутое приложение ClickOnce quite recently. Вы столкнулись с еще одной проблемой: вы не сможете определить, что пользователь отменил программу удаления ClickOnce, потому что rundll32.exe не вернет ничего, кроме 0, поэтому нет возможности получить обратную связь от выполняемой библиотечной функции. . Если вы можете определить, установлено ли приложение ClickOnce, я бы сделал это снова после возврата вашей функции legacy_check.   -  person TLama    schedule 10.10.2014
comment
@TLama, это означает, что я не могу удалить его молча. и не могу завершить мою программу установки, как только пользователь нажмет кнопку отмены? По крайней мере, я могу использовать обработку события кнопки отмены что-то подобное?   -  person beginner    schedule 10.10.2014
comment
Во-первых, Inno Setup не имеет ничего общего с ClickOnce. Теперь я совершенно потерял то, что вы на самом деле собираетесь делать. Я получил ваш вопрос о том, что вы хотите определить, нажал ли пользователь кнопку отмены выполненного деинсталлятора ClickOnce. Разве это не так?   -  person TLama    schedule 10.10.2014
comment
MS не предоставляет (разумного) API для этой части... программного обеспечения :) И я имел в виду, что вы не можете получить никакой обратной связи от вашего ShellExec вызова функции, от этого ClickOnce чего-то. Поэтому, если вы спрашиваете, можете ли вы определить, нажал ли пользователь кнопку отмены в этом деинсталляторе ClickOnce, то нет, это невозможно (если вы не будете взаимодействовать с этим деинсталлятором ClickOnce иначе, чем вызовом rundll32.exe).   -  person TLama    schedule 10.10.2014
comment
это не деинсталлятор clickonce. Это строка деинсталлятора, которую я получил из regedit после установки установочного файла.   -  person beginner    schedule 10.10.2014
comment
dfshim.dll является частью ClickOnce, строка удаления, такая как rundll32.exe dfshim.dll,ShArpMaintain..., не имеет ничего общего с Inno Setup. Inno Setup создает двоичные файлы деинсталлятора, такие как, например. unins000.exe.   -  person TLama    schedule 10.10.2014
comment
@TLama, хорошо, спасибо :)   -  person beginner    schedule 10.10.2014


Ответы (1)


Я изменил свой код, как показано ниже, чтобы выполнить требование:

function legacy_check(): Boolean;
begin
   ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
   if RegKeyExists(HKEY_CURRENT_USER,'Software\Microsoft\Windows\CurrentVersion\Uninstall\myapp') then
                  Result := False
               else
                  Result := True; 
end;

function InitializeSetup(): Boolean;
begin                                  
   Result:=legacy_check();
    if Not Result then 
    begin
       Result:=False
    else
      // code to install latest version 
end;
person beginner    schedule 10.10.2014
comment
if not Result then Result := False не так много делает :) В любом случае, я бы предпочел сделать 2 функции, одну для проверки того, установлено ли приложение, и одну для удаления. Таким образом, вы можете легко проверить, работает ли приложение. устанавливается и только потом удаляется. Я имею в виду something like. - person TLama; 10.10.2014
comment
@TLama, да, это лучше, чем мой подход .. :) Спасибо. Вместо комментария, не могли бы вы написать свой ответ, чтобы я мог принять его как ответ? :) - person beginner; 13.10.2014
comment
Не стесняйтесь включать это в свой ответ ;) - person TLama; 15.10.2014
comment
@TLama, да, я использовал это в своем коде, теперь он работает нормально. Спасибо :) - person beginner; 15.10.2014