2

InstallShield LE는 VS 2017에서 지원되지 않으므로 대신 Inno Setup을 사용하려고합니다.Inno 설치 프로그램 인스톨러에서 InstallShield LE로 설치 제거하기

그러나 Inno 설치 스크립트를 사용하여 설치를 시작하기 전에 InstallShield LE로 만든 이전 설치를 어떻게 제거 할 수 있습니까?
다른 사용자 (같은 컴퓨터가 아닌)에 여러 버전의 응용 프로그램이 설치되어 있습니다.

버전간에 제품 코드가 변경되므로 Uninstall GUID가 다를 수 있으며 그 때문에 레지스트리의 제거 부분에서 찾기가 어렵습니다.

+0

Inno Setup은 VS 2017에 직접 통합 될 수 있습니다 (ISLE 대체품으로). 이 확장 프로그램을 보시려면 https://marketplace.visualstudio.com/items?itemName=unSignedsro.VisualInstaller (자기 프로모션이 아쉽습니다) – Slappy

+0

Inno Setup 부분은 말할 수 없지만 설치된 제품의 제품을 찾기위한 원시 C++ API UpgradeCode의 코드는 [MsiEnumRelatedProducts] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370103)입니다. –

+0

FWIW, ISLE은 할 수있는 일이 제한되어 있으므로 Windows Installer XML로 마이그레이션하는 것이 매우 쉽습니다. 특히 IsWiX를 사용한 경우. –

답변

2

당신은 Inno Setup: How to automatically uninstall previous installed version?

의 코드를 사용할 수 있습니다, 그것은 이전 제거 시스템으로 작동하기에 충분 대부분의 일반적인합니다.

InstallShield에서 작동되게하려면 제거 할 릴리스의 제품 코드를 알아야합니다. 릴리스를 제거 할 수 있어야하는 경우 업그레이드 코드를 사용하여 실제로 설치된 릴리스의 제품 코드를 조회 할 수 있습니다. 이를 위해 WMI 쿼리 (
How to find the UpgradeCode and ProductCode of an installed application in Windows 7)를 사용할 수 있습니다. 쿼리가 수십 초 걸릴 수

const 
    InstallShieldUpgradeCode = '{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'; 

function InitializeSetup(): Boolean; 
var 
    WbemLocator, WbemServices, WbemObjectSet: Variant; 
    Query: string; 
    ProductCode: string; 
begin 
    WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2'); 
    Query := 
    'SELECT ProductCode FROM Win32_Property ' + 
    'WHERE Property="UpgradeCode" AND Value="' + InstallShieldUpgradeCode + '"'; 
    WbemObjectSet := WbemServices.ExecQuery(Query); 
    if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then 
    begin 
    ProductCode := WbemObjectSet.ItemIndex(0).ProductCode; 

    { Start uninstall here } 
    end; 

    Result := True; 
end; 

비록 노트 :

는 이노 설정 파스칼 스크립트의 코드는 같이 할 수 있습니다.

1
내가 샘플 스크립트를 작성

the related blog post,

function InitializeSetup(): Boolean; 
var 
    oldVersion: String; 
    uninstaller: String; 
    ErrorCode: Integer; 
begin 
    if RegKeyExists(HKEY_LOCAL_MACHINE, 
    'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1') then 
    begin 
    RegQueryStringValue(HKEY_LOCAL_MACHINE, 
     'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1', 
     'DisplayVersion', oldVersion); 
    if (CompareVersion(oldVersion, '6.0.0.1004') < 0) then 
    begin 
     if MsgBox('Version ' + oldVersion + ' of Code Beautifier Collection is already installed. Continue to use this old version?', 
     mbConfirmation, MB_YESNO) = IDYES then 
     begin 
     Result := False; 
     end 
     else 
     begin 
      RegQueryStringValue(HKEY_LOCAL_MACHINE, 
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F768F6BA-F164-4599-BC26-DCCFC2F76855}_is1', 
      'UninstallString', uninstaller); 
      ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); 
      Result := True; 
     end; 
    end 
    else 
    begin 
     MsgBox('Version ' + oldVersion + ' of Code Beautifier Collection is already installed. This installer will exit.', 
     mbInformation, MB_OK); 
     Result := False; 
    end; 
    end 
    else 
    begin 
    Result := True; 
    end; 
end; 

귀하의 installshiled 기반 설치도 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\에 GUID를 기반으로 하위 트리를 삽입해야합니다, 당신은 이전에 설치된 소프트웨어를 감지 할 수있는 레지스트리를 조회해야한다는 매우 분명했다 그래서 거기에 있었던 것을 분석하고 제거하기 위해 필요한 조치를 취하십시오.

A more recent blog post can be found here. 답변에 코드가 이노 설치 프로그램 설치 이전 버전을 제거하는 동안

+0

InstallShield LE에는 ProductCode 및 UpgradeCode라는 두 개의 guid가 있습니다. 업그레이드 코드는 모든 버전에서 동일합니다. 그러나 제품의 최신 버전을 설치하려면 제품 코드가 업데이트되고 ... \ uninstall \ {guid} 아래의 레지스트리 키에서 guid가 제품 코드 인 것 같습니다. InstallShield가 코드를 관리하는 방법을 모르겠습니다. 그래서 제 경우에는 제품 코드가 다른 버전을 가질 수 있습니다. InstallShield가 동일한 제품인지 확인하는 방법 일 것이라고 추측했기 때문에 레지스트리에서 업그레이드 코드를 찾으려고했습니다. – Peter

+0

@ 피터는 InstallShield 문서에서 파헤쳐 야 할 비즈니스 논리와 정확히 일치합니다. 분명히 Inno Setup은 기본적으로 제공하지 않는 것을 사용합니다. –