2017-03-31 7 views
1

このアプリケーションでは64ビットがネイティブにサポートされるようになったため、デフォルトでC:\Program Filesディレクトリにインストールする必要があります。そのため、次の2つの指令を設定します。Innoセットアップ:アップグレード用の既存の32ビットインストールパスを維持し、新しいインストール用に64ビットパスを使用します。

ArchitecturesInstallIn64BitMode=x64 
DefaultDirName={pf}\{#ProductName} 

これまでのところ問題なく動作します。

問題は、製品がまだ32ビットのみのため、正しくインストールされているため、C:\Program Files (x86)の下に正しくインストールされていることです。

通常、Inno Setupは既存のインストールを検出し、同じインストールパスを使用します(存在する場合)。しかし、これは32ビットから64ビットモードに変更したときにはうまくいかないように思われます。これはおそらく、異なるアンインストールレジストリキーが使用されたためです。

アプリケーションがすでにインストールされている場合(アップデートを実行するため)、新規インストールの場合は64ビットのみを使用する場合は、既存の32ビットインストールパスを使用するようにInno Setupに指示する方法はありますか?

答えて

1

私はInno Setupで自動的にこれを行うことはできません。

ただし、インストーラを初期化するときに、32ビットのレジストリキーを64ビットにコピーして、すべてのInnoセットアップで見つけることができます。もちろん、インストールがキャンセルされた場合は、コピーをロールバックする必要があります。

#define AppId "My Program" 

[Setup] 
AppId={#AppId} 
DefaultDirName={pf}\My Program 
ArchitecturesInstallIn64BitMode=x64 
[Code] 

const 
    UninstallKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}_is1'; 

var 
    Rollback64Key: Boolean; 
    RootKey32: Integer; 
    RootKey64: Integer; 

procedure Copy32BitUninstallKeyTo64bit; 
var 
    I: Integer; 
    ValueNames: TArrayOfString; 
    ValueName: string; 
    ValueStr: string; 
    ValueDWord: Cardinal; 
    Success: Boolean; 
begin 
    if RegKeyExists(HKCU64, UninstallKey) or 
    RegKeyExists(HKLM64, UninstallKey) then 
    begin 
    Log('64-bit uninstall key found, leaving as it is'); 
    end 
    else 
    begin 
    if RegKeyExists(HKCU32, UninstallKey) then 
    begin 
     Log('32-bit HKCU uninstall key found, will copy it to the 64-bit key'); 
     RootKey32 := HKCU32; 
     RootKey64 := HKCU64; 
    end 
     else 
    if RegKeyExists(HKLM32, UninstallKey) then 
    begin 
     Log('32-bit HKLM uninstall key found, will copy it to the 64-bit key'); 
     RootKey32 := HKLM32; 
     RootKey64 := HKLM64; 
    end 
     else 
    begin 
     Log('No 32-bit uninstall key found'); 
     RootKey32 := 0; 
     RootKey64 := 0; 
    end; 

    if RootKey32 <> 0 then 
    begin 
     if not RegGetValueNames(RootKey32, UninstallKey, ValueNames) then 
     begin 
     Log('Cannot list 32-bit uninstall key values'); 
     end 
     else 
     begin 
     I := 0; 
     Success := True; 
     while (I < GetArrayLength(ValueNames)) and Success do 
     begin 
      ValueName := ValueNames[I]; 
      if RegQueryStringValue(RootKey32, UninstallKey, ValueName, ValueStr) then 
      begin 
      if not RegWriteStringValue(RootKey64, UninstallKey, ValueName, ValueStr) then 
      begin 
       Log(Format('Error copying "%s" string value', [ValueName])); 
       Success := False; 
      end 
       else 
      begin 
       Log(Format('Copied "%s" string value', [ValueName])); 
      end; 
      end 
      else 
      if RegQueryDWordValue(RootKey32, UninstallKey, ValueName, ValueDWord) then 
      begin 
      if not RegWriteDWordValue(RootKey64, UninstallKey, ValueName, ValueDWord) then 
      begin 
       Log(Format('Error copying "%s" dword value', [ValueName])); 
       Success := False; 
      end 
       else 
      begin 
       Log(Format('Copied "%s" dword value', [ValueName])); 
      end; 
      end 
      else 
      begin 
      { All uninstall values written by Inno Setup are either string or dword } 
      Log(Format('Value "%s" is neither string nor dword', [ValueName])); 
      Success := False; 
      end; 

      I := I + 1; 
     end; 

     if Success then 
     begin 
      Log('Copied 32-bit uninstall key to 64-bit'); 
      Rollback64Key := True; 
     end 
      else 
     begin 
      if not RegDeleteKeyIncludingSubkeys(RootKey64, UninstallKey) then 
      begin 
      Log('Failed to copy 32-bit uninstall key to 64-bit, ' + 
       'and also failed to rollback the changes'); 
      end 
      else 
      begin 
      Log('Failed to copy 32-bit uninstall key to 64-bit, rolled back the changes'); 
      end; 
     end; 
     end; 
    end; 
    end; 
end; 

function InitializeSetup(): Boolean; 
begin 
    if IsWin64 then 
    begin 
    Copy32BitUninstallKeyTo64bit; 
    end; 

    Result := True; 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssPostInstall then 
    begin 
    if Rollback64Key then 
    begin 
     Log('Installation finished, removing obsolete 32-bit key'); 
     Rollback64Key := False; 

     if not RegDeleteKeyIncludingSubkeys(RootKey32, UninstallKey) then 
     begin 
     Log('Failed to remove obsolete 32-bit uninstall key'); 
     end 
     else 
     begin 
     Log('Removed obsolete 32-bit uninstall key'); 
     end; 
    end; 
    end; 
end; 

procedure DeinitializeSetup(); 
begin 
    if Rollback64Key then 
    begin 
    Log('Installation cancelled, rolling back cloned 64-bit uninstall key'); 

    if not RegDeleteKeyIncludingSubkeys(RootKey64, UninstallKey) then 
    begin 
     Log('Failed to roll back cloned 64-bit uninstall key'); 
    end 
     else 
    begin 
     Log('Rolled back cloned 64-bit uninstall key'); 
    end; 
    end; 
end; 

(Inno SetupののUnicodeバージョンでテストが、あまりにもANSIバージョンで動作するはずです)非常に迅速な回答、マーティンのため

+1

ありがとう!私はそれを直接テストします。 –

+0

もう一度お返事ありがとうございます:あなたは正しいです、私はまた、セットアップは、よく機能する古い32ビットのアンインストールキーを削除するようになったことを確認しました。ちょうど1つの問題が残っています:明らかにあまり意味を持たない新しい64ビットバージョンで古い32ビットバージョンをアップグレードしようとすると、ユーザーは「ディレクトリがすでに存在します」というメッセージが表示されます。この無駄なメッセージをどのように抑制するかについての考えはありますか?ありがとうございました! –

+1

OKだから、ハッキングをやめ、実際に32ビット鍵を64ビット鍵にコピーしてすべてを動作させる時が来ました。私の更新答えを見てください。 –

関連する問題