[Setup] Don't force default installer location when it wasn't specified (#13397)
This commit is contained in:
parent
d7098e87ee
commit
88e24263cf
|
@ -121,17 +121,22 @@ bool uninstall_msi_version(const std::wstring& package_path)
|
||||||
return ERROR_SUCCESS == uninstall_result;
|
return ERROR_SUCCESS == uninstall_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<VersionHelper> get_installed_powertoys_version()
|
struct InstalledVersionInfo
|
||||||
|
{
|
||||||
|
VersionHelper version;
|
||||||
|
std::wstring install_folder;
|
||||||
|
};
|
||||||
|
std::optional<InstalledVersionInfo> get_installed_powertoys_version()
|
||||||
{
|
{
|
||||||
auto installed_path = GetMsiPackageInstalledPath();
|
auto installed_path = GetMsiPackageInstalledPath();
|
||||||
if (!installed_path)
|
if (!installed_path)
|
||||||
{
|
{
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
*installed_path += L"\\PowerToys.exe";
|
std::wstring executable_path = *installed_path + L"\\PowerToys.exe";
|
||||||
|
|
||||||
// Get the version information for the file requested
|
// Get the version information for the file requested
|
||||||
const DWORD fvSize = GetFileVersionInfoSizeW(installed_path->c_str(), nullptr);
|
const DWORD fvSize = GetFileVersionInfoSizeW(executable_path.c_str(), nullptr);
|
||||||
if (!fvSize)
|
if (!fvSize)
|
||||||
{
|
{
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
@ -139,7 +144,7 @@ std::optional<VersionHelper> get_installed_powertoys_version()
|
||||||
|
|
||||||
auto pbVersionInfo = std::make_unique<BYTE[]>(fvSize);
|
auto pbVersionInfo = std::make_unique<BYTE[]>(fvSize);
|
||||||
|
|
||||||
if (!GetFileVersionInfoW(installed_path->c_str(), 0, fvSize, pbVersionInfo.get()))
|
if (!GetFileVersionInfoW(executable_path.c_str(), 0, fvSize, pbVersionInfo.get()))
|
||||||
{
|
{
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
@ -150,23 +155,17 @@ std::optional<VersionHelper> get_installed_powertoys_version()
|
||||||
{
|
{
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
return VersionHelper{ (fileInfo->dwFileVersionMS >> 16) & 0xffff,
|
return InstalledVersionInfo{
|
||||||
(fileInfo->dwFileVersionMS >> 0) & 0xffff,
|
.version = VersionHelper{ (fileInfo->dwFileVersionMS >> 16) & 0xffff,
|
||||||
(fileInfo->dwFileVersionLS >> 16) & 0xffff };
|
(fileInfo->dwFileVersionMS >> 0) & 0xffff,
|
||||||
|
(fileInfo->dwFileVersionLS >> 16) & 0xffff },
|
||||||
|
.install_folder = std::move(*installed_path)
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
int Bootstrapper(HINSTANCE hInstance)
|
int Bootstrapper(HINSTANCE hInstance)
|
||||||
{
|
{
|
||||||
winrt::init_apartment();
|
winrt::init_apartment();
|
||||||
char* programFilesDir = nullptr;
|
|
||||||
size_t size = 0;
|
|
||||||
std::string defaultInstallDir;
|
|
||||||
|
|
||||||
if (!_dupenv_s(&programFilesDir, &size, "PROGRAMFILES"))
|
|
||||||
{
|
|
||||||
defaultInstallDir += programFilesDir;
|
|
||||||
defaultInstallDir += "\\PowerToys";
|
|
||||||
}
|
|
||||||
|
|
||||||
fs::path logDir = PTSettingsHelper::get_root_save_folder_location();
|
fs::path logDir = PTSettingsHelper::get_root_save_folder_location();
|
||||||
|
|
||||||
|
@ -182,7 +181,7 @@ int Bootstrapper(HINSTANCE hInstance)
|
||||||
("skip_dotnet_install", "Skip dotnet 3.X installation even if it's not detected")
|
("skip_dotnet_install", "Skip dotnet 3.X installation even if it's not detected")
|
||||||
("log_level", "Log level. Possible values: off|debug|error", cxxopts::value<std::string>()->default_value("off"))
|
("log_level", "Log level. Possible values: off|debug|error", cxxopts::value<std::string>()->default_value("off"))
|
||||||
("log_dir", "Log directory", cxxopts::value<std::string>()->default_value(logDir.string()))
|
("log_dir", "Log directory", cxxopts::value<std::string>()->default_value(logDir.string()))
|
||||||
("install_dir", "Installation directory", cxxopts::value<std::string>()->default_value(defaultInstallDir))
|
("install_dir", "Installation directory", cxxopts::value<std::string>()->default_value(""))
|
||||||
("extract_msi", "Extract MSI to the working directory and exit. Use only if you must access MSI directly.");
|
("extract_msi", "Extract MSI to the working directory and exit. Use only if you must access MSI directly.");
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
@ -231,7 +230,7 @@ int Bootstrapper(HINSTANCE hInstance)
|
||||||
|
|
||||||
installFolderProp = std::wstring(installDir.length(), L' ');
|
installFolderProp = std::wstring(installDir.length(), L' ');
|
||||||
std::copy(installDir.begin(), installDir.end(), installFolderProp.begin());
|
std::copy(installDir.begin(), installDir.end(), installFolderProp.begin());
|
||||||
installFolderProp = L"INSTALLFOLDER=" + installFolderProp;
|
installFolderProp = L"INSTALLFOLDER=\"" + installFolderProp + L"\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -281,12 +280,21 @@ int Bootstrapper(HINSTANCE hInstance)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there's a newer version installed
|
// Check if there's a newer version installed
|
||||||
const auto installedVersion = get_installed_powertoys_version();
|
const auto installedVersionInfo = get_installed_powertoys_version();
|
||||||
if (installedVersion && *installedVersion >= myVersion)
|
if (installedVersionInfo)
|
||||||
{
|
{
|
||||||
spdlog::error(L"Detected a newer version {} vs {}", (*installedVersion).toWstring(), myVersion.toWstring());
|
if (installedVersionInfo->version >= myVersion)
|
||||||
ShowMessageBoxError(IDS_NEWER_VERSION_ERROR);
|
{
|
||||||
return 0;
|
spdlog::error(L"Detected a newer version {} vs {}", installedVersionInfo->version.toWstring(), myVersion.toWstring());
|
||||||
|
ShowMessageBoxError(IDS_NEWER_VERSION_ERROR);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// If we are good to go and install folder wasn't specified via cmd line, make sure to retain the previous
|
||||||
|
// installation path
|
||||||
|
else if (installFolderProp.empty())
|
||||||
|
{
|
||||||
|
installFolderProp = L"INSTALLFOLDER=\"" + installedVersionInfo->install_folder + L"\"";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup MSI UI visibility and restart as elevated if required
|
// Setup MSI UI visibility and restart as elevated if required
|
||||||
|
|
Loading…
Reference in a new issue