私は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バージョンで動作するはずです)非常に迅速な回答、マーティンのため
ありがとう!私はそれを直接テストします。 –
もう一度お返事ありがとうございます:あなたは正しいです、私はまた、セットアップは、よく機能する古い32ビットのアンインストールキーを削除するようになったことを確認しました。ちょうど1つの問題が残っています:明らかにあまり意味を持たない新しい64ビットバージョンで古い32ビットバージョンをアップグレードしようとすると、ユーザーは「ディレクトリがすでに存在します」というメッセージが表示されます。この無駄なメッセージをどのように抑制するかについての考えはありますか?ありがとうございました! –
OKだから、ハッキングをやめ、実際に32ビット鍵を64ビット鍵にコピーしてすべてを動作させる時が来ました。私の更新答えを見てください。 –