diff --git a/builds/install/arch-specific/win32/FirebirdInstallEnvironmentChecks.inc b/builds/install/arch-specific/win32/FirebirdInstallEnvironmentChecks.inc index ba627ec832..0a4fcfa812 100644 --- a/builds/install/arch-specific/win32/FirebirdInstallEnvironmentChecks.inc +++ b/builds/install/arch-specific/win32/FirebirdInstallEnvironmentChecks.inc @@ -84,38 +84,44 @@ Const BrokenInstall = 32; //version or component mismatch found, so mark broken //Possible product installs - IB4Install = 0; - IB5Install = 1; - IB6Install = 2; - IB65Install = 3; - IB70Install = 4; - FB1Install = 5; - FB15RCInstall = 6; - FB15Install = 7; - FB20Install = 8; - IB80Install = 9; - IB81Install = 10; - FB21Install = 11; - FB25Install = 12; - FB30Install = 13; + IB4Install = 0; + IB5Install = 1; + IB6Install = 2; + IB65Install = 3; + IB70Install = 4; + FB1Install = 5; + FB15RCInstall = 6; + FB15Install = 7; + FB20Install = 8; + IB80Install = 9; + IB81Install = 10; + FB21Install = 11; + FB21_x64_Install = 12; + FB25Install = 13; + FB25_x64_Install = 14; + FB30Install = 15; + FB30_x64_Install = 16; - MaxProdInstalled = FB30Install; - - //ProductsInstalled - IB4 = $0001; - IB5 = $0002; - IB6 = $0004; - IB65 = $0008; - IB70 = $0010; - FB1 = $0020; - FB15RC = $0040; - FB15 = $0080; - FB20 = $0100; - IB80 = $0200; - IB81 = $0400; - FB21 = $0800; - FB25 = $1000; - FB30 = $2000; + MaxProdInstalled = FB30_x64_Install; + +//ProductsInstalled + IB4 = $00001; + IB5 = $00002; + IB6 = $00004; + IB65 = $00008; + IB70 = $00010; + FB1 = $00020; + FB15RC = $00040; + FB15 = $00080; + FB20 = $00100; + IB80 = $00200; + IB81 = $00400; + FB21 = $00800; + FB25 = $01000; + FB30 = $02000; + FB21_x64 = $04000; + FB25_x64 = $08000; + FB30_x64 = $10000; // Likely gds32 version strings for installed versions of Firebird or InterBase are: // [6,0,n,n] InterBase 6.0 @@ -152,6 +158,7 @@ Type InstallType: Integer; ActualVersion: String; FirebirdVersion:String; + RootKey: Integer; end; @@ -162,6 +169,7 @@ procedure InitExistingInstallRecords; var product: Integer; begin + SetArrayLength(ProductsInstalledArray,MaxProdInstalled + 1); for product := 0 to MaxProdInstalled do begin @@ -174,6 +182,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IB4MessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; IB5Install: begin @@ -181,6 +190,7 @@ begin ProductsInstalledArray[product].RegKey := IB5RegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; IB6Install: begin @@ -188,6 +198,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; IB65Install: begin @@ -195,6 +206,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; IB70Install: begin @@ -202,6 +214,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; IB80Install: begin @@ -209,6 +222,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; IB81Install: begin @@ -216,6 +230,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; FB1Install: begin @@ -223,6 +238,7 @@ begin ProductsInstalledArray[product].RegKey := IBRegKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := IBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; FB15RCInstall: begin @@ -230,6 +246,7 @@ begin ProductsInstalledArray[product].RegKey := FB15RCKey; ProductsInstalledArray[product].RegEntry := LegacyRegPathEntry; ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; FB15Install: begin @@ -237,6 +254,7 @@ begin ProductsInstalledArray[product].RegKey := FB2RegKey; ProductsInstalledArray[product].RegEntry := FBRegPathEntry; ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; FB20Install: begin @@ -244,36 +262,66 @@ begin ProductsInstalledArray[product].RegKey := FB2RegKey; ProductsInstalledArray[product].RegEntry := FBRegPathEntry; ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; end; FB21Install: begin - ProductsInstalledArray[product].Description := FBDesc; + ProductsInstalledArray[product].Description := FBDesc + ' (Win32) '; ProductsInstalledArray[product].RegKey := FB2RegKey; ProductsInstalledArray[product].RegEntry := FBRegPathEntry; ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; + end; + + FB21_x64_Install: begin + if iswin64 then begin + ProductsInstalledArray[product].Description := FBDesc + ' (x64) '; + ProductsInstalledArray[product].RegKey := FB2RegKey; + ProductsInstalledArray[product].RegEntry := FBRegPathEntry; + ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM64; + end; end; FB25Install: begin - ProductsInstalledArray[product].Description := FBDesc; + ProductsInstalledArray[product].Description := FBDesc + ' (Win32) '; ProductsInstalledArray[product].RegKey := FB2RegKey; ProductsInstalledArray[product].RegEntry := FBRegPathEntry; ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; + end; + + FB25_x64_Install: begin + ProductsInstalledArray[product].Description := FBDesc + ' (x64) '; + ProductsInstalledArray[product].RegKey := FB2RegKey; + ProductsInstalledArray[product].RegEntry := FBRegPathEntry; + ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM64; end; FB30Install: begin - ProductsInstalledArray[product].Description := FBDesc; + ProductsInstalledArray[product].Description := FBDesc + ' (Win32) '; ProductsInstalledArray[product].RegKey := FB2RegKey; ProductsInstalledArray[product].RegEntry := FBRegPathEntry; ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM32; + end; + + FB30_x64_Install: begin + ProductsInstalledArray[product].Description := FBDesc + ' (x64) '; + ProductsInstalledArray[product].RegKey := FB2RegKey; + ProductsInstalledArray[product].RegEntry := FBRegPathEntry; + ProductsInstalledArray[product].MessageFile := FBMessageFile; + ProductsInstalledArray[product].RootKey := HKLM64; end; end; //case - ProductsInstalledArray[product].Path := GetRegistryEntry( - ProductsInstalledArray[product].RegKey, ProductsInstalledArray[product].RegEntry); + ProductsInstalledArray[product].Path := GetRegistryEntry(ProductsInstalledArray[product].RootKey, + ProductsInstalledArray[product].RegKey, ProductsInstalledArray[product].RegEntry); ProductsInstalledArray[product].RegVersion := GetRegistryEntry( - ProductsInstalledArray[product].RegKey, 'Version'); + ProductsInstalledArray[product].RootKey, ProductsInstalledArray[product].RegKey, 'Version'); end; //for end; //function @@ -533,6 +581,20 @@ begin end; end; + FB21_x64_Install: begin + if iswin64 then begin + if (CompareVersion(ProductsInstalledArray[product].ClientVersion, '2.1.0.0',2) <> 0) then + ProductsInstalledArray[product].InstallType := NotInstalled + else + if ((ProductsInstalledArray[product].InstallType AND ClientInstall) = ClientInstall) then begin + ProductsInstalled := ProductsInstalled + FB21_x64; + ProductsInstalledCount := ProductsInstalledCount + 1; + end + else + ProductsInstalledArray[product].InstallType := NotInstalled; + end; + end; + FB25Install: begin if (CompareVersion(ProductsInstalledArray[product].ClientVersion, '2.5.0.0',2) <> 0) then ProductsInstalledArray[product].InstallType := NotInstalled @@ -543,6 +605,16 @@ begin end; end; + FB25_x64_Install: begin + if (CompareVersion(ProductsInstalledArray[product].ClientVersion, '2.5.0.0',2) <> 0) then + ProductsInstalledArray[product].InstallType := NotInstalled + else + if ((ProductsInstalledArray[product].InstallType AND ClientInstall) = ClientInstall) then begin + ProductsInstalled := ProductsInstalled + FB25_x64; + ProductsInstalledCount := ProductsInstalledCount + 1; + end; + end; + FB30Install: begin if (CompareVersion(ProductsInstalledArray[product].ClientVersion, '3.0.0.0',2) <> 0) then ProductsInstalledArray[product].InstallType := NotInstalled @@ -553,6 +625,16 @@ begin end; end; + FB30_x64_Install: begin + if (CompareVersion(ProductsInstalledArray[product].ClientVersion, '3.0.0.0',2) <> 0) then + ProductsInstalledArray[product].InstallType := NotInstalled + else + if ((ProductsInstalledArray[product].InstallType AND ClientInstall) = ClientInstall) then begin + ProductsInstalled := ProductsInstalled + FB30_x64; + ProductsInstalledCount := ProductsInstalledCount + 1; + end; + end; + end;//case diff --git a/builds/install/arch-specific/win32/FirebirdInstallSupportFunctions.inc b/builds/install/arch-specific/win32/FirebirdInstallSupportFunctions.inc index a60baffb8d..1d28e80053 100644 --- a/builds/install/arch-specific/win32/FirebirdInstallSupportFunctions.inc +++ b/builds/install/arch-specific/win32/FirebirdInstallSupportFunctions.inc @@ -25,6 +25,8 @@ Function Prototypes + function IsWin32: boolean; + function Is32BitInstallMode: boolean; function IsVista: boolean; function IsWin2k3: boolean; function IsWinXP: boolean; @@ -108,6 +110,19 @@ v4.0 4.0.6001.16531 or greater Released with Windows Vista SP1 and systems do not have v3.0 of the Windows Installer. *) + +function IsWin32: boolean; +//helper function to simplify logic of x86/win64 checks. +begin + result := not IsWin64; +end; + +function Is32BitInstallMode: boolean; +//helper function to simplify logic of x86/win64 checks. +begin + result := not Is64BitInstallMode; +end; + function IsVista: boolean; var Version: TWindowsVersion; @@ -368,10 +383,17 @@ begin end; -function GetRegistryEntry(RegKey, RegEntry: string): String; + +function GetRegistryEntry(RootKey: Integer; RegKey, RegEntry: string): String; begin - result := ''; - RegQueryStringValue(HKEY_LOCAL_MACHINE, RegKey, RegEntry, Result); + Result := ''; + //if not win64 and RootKey is HKLM64 then we are on a 32-bit box, + //so skip looking in registry + if ( (RootKey = HKLM64) AND (iswin32) ) then + //do nothing + Result := '' + else + RegQueryStringValue(RootKey, RegKey, RegEntry, Result); end; diff --git a/builds/install/arch-specific/win32/FirebirdInstall_20.iss b/builds/install/arch-specific/win32/FirebirdInstall_20.iss index 779ac87910..f5777bf563 100644 --- a/builds/install/arch-specific/win32/FirebirdInstall_20.iss +++ b/builds/install/arch-specific/win32/FirebirdInstall_20.iss @@ -675,8 +675,12 @@ end; for i:=0 to ProductsInstalledCount-1 do InstallSummary := InstallSummary + InstallSummaryArray[i] + #13; -//If FB2 is installed -If ((ProductsInstalled AND FB2) = FB2) then +//If FB21 is installed +#if PlatformTarget == "x64" +If ((ProductsInstalled AND FB21_x64 ) = FB21_x64 ) then +#else +If ((ProductsInstalled AND FB21 ) = FB21 ) then +#endif InstallSummary := InstallSummary +#13 + ExpandConstant('{cm:InstallSummarySuffix1}') +#13 + ExpandConstant('{cm:InstallSummarySuffix2}') @@ -716,10 +720,14 @@ begin end; - //If Fb2.0 is installed then we can install over it. - //unless we find the server running. - if (ProductsInstalledCount = 1) AND - ((ProductsInstalled AND FB2) = FB2) then begin + //If existing install of the same majorver.minorver is found then + //we can upgrade it unless we find the server running. + if ( (ProductsInstalledCount = 1) AND +#if PlatformTarget == "x64" + ((ProductsInstalled AND FB21_x64 ) = FB21_x64 ) ) then begin +#else + ((ProductsInstalled AND FB21 ) = FB21 ) ) then begin +#endif VerString := ( FirebirdDefaultServerRunning ); if VerString <> '' then begin result := false;