2016-06-30 5 views
1

Привет, мне нужно удалить мою программу, когда она запущена в 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; 

Как я могу исправить это супер-неправильный код?

Заранее спасибо.

ответ

1
const 
    ExeName = 'W10logbcr.exe'; 

function InitializeUninstall(): Boolean; 
var 
    ErrorCode: Integer; 
begin 
    if IsProcessRunning(ExeName) then 
    begin 
    if MsgBox(
     'Windows 10 Logon Background Changer is running. ' + 
     'Do you like to close it automatically and uninstall?', 
     mbError, MB_YESNO) <> IDYES then 
    begin 
     Result := False; 
     exit; 
    end 
     else 
    begin 
     ShellExec(
     'open', 'taskkill.exe', '/f /im ' + ExeName, '', SW_HIDE, ewNoWait, ErrorCode); 
    end; 
    end; 

    Result := True; 
end; 

Обратите внимание, что я удалил tskill.exe, как я считаю, что это не имеет значения в настоящее время. Это было необходимо для домашних изданий только для Windows XP и даже для старой версии Windows. И на самом деле он больше не доступен на Windows 10.

Также обратите внимание, что я заменил ваш IsProcessRunning на лучший implementation by @ariwez.

+0

Спасибо, но где вы обнаружили '= IDYES, а затем продолжить деинсталлировать процесс убийства? Я имею в виду, если пользователь нажмет «Да»? Извините, если вы указали его другим способом в коде, который вы дали, чтобы ответить. – flavalee

+0

Это неявное. Если пользователь нажимает * No *, вы попадаете в ветвь 'exit'. Если пользователь нажимает что-либо еще, выполнение пропускает ветвь 'exit' и продолжается с помощью' ShellExec'. Во всяком случае, я добавил ветку 'else', чтобы она была более очевидной. Но это избыточно. –

+0

Я также изменил условие с '= IDNO' на' <> IDYES'. Это безопаснее. –