Привет, мне нужно удалить мою программу, когда она запущена в Windows с помощью Inno Setup.Как удалить программу при ее запуске и только после подтверждения пользователя закрыть и удалить ее - Inno Setup
Мне нравится, что мой деинсталлятор обнаруживает, если он работает, и предоставляет пользователю окно с сообщением, например «Запускается фоновый чейнджер Windows 10. Вы хотите его закрыть и удалить?»
окно сообщения, описанная выше, имеет две кнопки (Да и Нет).
Когда это окно появляется после того, как пользователь решит удалить его, даже если он запущен, и когда пользователь выберет No в окне сообщения, деинсталлятор должен закрыть.
Если пользователь выберет Да в этом окне сообщения, деинсталлятор должен убить запущенный программный процесс и удалить его нормально (не молча).
Я написал код, чтобы сделать это, но он терпит неудачу и дает неправильное поведение.
Мой код:
function IsProcessRunning(const FileName: string): Boolean;
var
FWMIService: Variant;
FSWbemLocator: Variant;
FWbemObjectSet: Variant;
begin
Result := False;
FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
Result := (FWbemObjectSet.Count > 0);
FWbemObjectSet := Unassigned;
FWMIService := Unassigned;
FSWbemLocator := Unassigned;
end;
function InitializeUninstall(): Boolean;
var ErrorCode: Integer;
begin
Result := not IsProcessRunning('W10logbcr.exe');
if not Result then
Msgbox('Windows 10 Logon Background Changer is running.Do you like to close it automatically and uninstall?', mbError, MB_YESNO);
if Msgbox('Windows 10 Logon Background Changer is running.Do you like to close it automatically and uninstall?', mbError, MB_YESNO) = IDNO then exit;
if Msgbox('Windows 10 Logon Background Changer is running.Do you like to close it automatically and uninstall?', mbError, MB_YESNO) = IDYES then begin
ShellExec('open','taskkill.exe','/f /im W10logbcr.exe','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','tskill.exe',' Windows 10 Logon Background Changer ','',SW_HIDE,ewNoWait,ErrorCode);
Result := True;
end;
end;
Как я могу исправить это супер-неправильный код?
Заранее спасибо.
Спасибо, но где вы обнаружили '= IDYES, а затем продолжить деинсталлировать процесс убийства? Я имею в виду, если пользователь нажмет «Да»? Извините, если вы указали его другим способом в коде, который вы дали, чтобы ответить. – flavalee
Это неявное. Если пользователь нажимает * No *, вы попадаете в ветвь 'exit'. Если пользователь нажимает что-либо еще, выполнение пропускает ветвь 'exit' и продолжается с помощью' ShellExec'. Во всяком случае, я добавил ветку 'else', чтобы она была более очевидной. Но это избыточно. –
Я также изменил условие с '= IDNO' на' <> IDYES'. Это безопаснее. –