2012-07-31 23 views
15

ユーザーが既にソフトウェアをインストールしているかどうかを検出するにはどうすればよいですか?もしそうなら、古いバージョンを削除する方法を提供する方法はありますか?古いインストールを検出して削除を提供するにはどうすればよいですか?

私はそれを確認するためにいくつかの行を書いています。それは今のところ正しいのですか?これが正しい場合は、インストールを続行するか古いバージョンをアンインストールするかをユーザーに選択させるにはどうすればよいですか?

#define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\setupname_is1" 

var 
    uninstallPath: string; 

function InitializeSetup: Boolean; 
begin 
    if (RegQueryStringValue(HKLM,'{#UNINSTKEY}','UninstallString',uninstallPath)) and 
    (uninstallPath <> '') and (fileexists(uninstallPath)) then 
    begin 
    Result := 
     (MsgBox(CustomMessage('NotVerifiedVersionFound'), mbConfirmation, 
       MB_YESNO or MB_DEFBUTTON2) = IDYES); 
    end; 
    { ... } 
end; 
+2

注意。例外はInno以外の設定からアップグレードする場合です。いったんInnoを使用すると、このすべてがあなたのために魔法のように扱われます。 – Deanna

+1

[InnoSetup:以前にインストールされたバージョンを自動的にアンインストールする方法は?](0120-18753) – Deanna

+0

@Deanna For myお客様は、このソフトウェアは常にイノセットアップでインストールされることは事実です。しかし、Innoは本当にそれを "処理"していませんか?すべての古いファイルを上書きしているだけです。私はUninstallerを生成することができます。しかし、私は最初のセットアップでアンインストール機能を使いたい。 – Exa

答えて

18

あなたは、もともとここに掲載クレイグ・マックイーンのソリューションを使用することができます:InnoSetup: How to automatically uninstall previous installed version?イノベースのセットアップでこれを行うする必要が正常に存在しないことを

function GetUninstallString: string; 
var 
    sUnInstPath: string; 
    sUnInstallString: String; 
begin 
    Result := ''; 
    sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1'); { Your App GUID/ID } 
    sUnInstallString := ''; 
    if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then 
    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); 
    Result := sUnInstallString; 
end; 

function IsUpgrade: Boolean; 
begin 
    Result := (GetUninstallString() <> ''); 
end; 

function InitializeSetup: Boolean; 
var 
    V: Integer; 
    iResultCode: Integer; 
    sUnInstallString: string; 
begin 
    Result := True; { in case when no previous version is found } 
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1', 'UninstallString') then { Your App GUID/ID } 
    begin 
    V := MsgBox(ExpandConstant('Hey! An old version of app was detected. Do you want to uninstall it?'), mbInformation, MB_YESNO); { Custom Message if App installed } 
    if V = IDYES then 
    begin 
     sUnInstallString := GetUninstallString(); 
     sUnInstallString := RemoveQuotes(sUnInstallString); 
     Exec(ExpandConstant(sUnInstallString), '', '', SW_SHOW, ewWaitUntilTerminated, iResultCode); 
     Result := True; { if you want to proceed after uninstall } 
     { Exit; //if you want to quit after uninstall } 
    end 
    else 
     Result := False; { when older version present and not uninstalled } 
    end; 
end; 
+0

ありがとうございました!私はこの質問がすぐに重複として閉じられると思う。この問題に関して既に質問されている他の質問は見られませんでした。 – Exa

+0

この機能の使用方法/呼び出し方法は?どのセクション?ここでは初心者初心者 – sam

+1

+1ほんの少しの音符。アプリケーションが非管理者によってインストールされた場合、レジストリキーは 'HKCU'であり、' HKLM'ではなく、そのコードは動作しません。また、 '{#SetupSetting(" AppId ")}'やプリプロセッサ変数を使って、レジストリキーのパスで 'AppId'を繰り返さないようにすることもできます。例については、[Inno Setup:インストール時に上書きする方法を教えてください。](http://stackoverflow.com/q/30566752/850848)を参照してください。または[コードのソース](http://stackoverflow.com/a/2099805/850848)(後者の記事も参照)。 –

関連する問題