bootstrapper: handle the unhandled

This commit is contained in:
yuyoyuppe
2020-09-07 16:42:15 +03:00
committed by Andrey Nekrasov
parent 305a04ce69
commit c2d6f740a1
4 changed files with 60 additions and 15 deletions

View File

@@ -91,7 +91,8 @@ std::unordered_set<CmdArgs> parseCmdArgs(const int nCmdArgs, LPWSTR* argList)
}
return result;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
int bootstrapper()
{
using namespace localized_strings;
winrt::init_apartment();
@@ -215,7 +216,7 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
break;
}
progressParams.progress = min(0.99f, progressParams.progress + 0.001f);
progressParams.progress = std::min(0.99f, progressParams.progress + 0.001f);
notifications::update_progress_bar_toast(TOAST_TAG, progressParams);
}
} }.detach();
@@ -257,12 +258,20 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
updateProgressBar(.5f, INSTALLING_DOTNET);
}
if (installDotnet &&
!updating::dotnet_is_installed() &&
!updating::install_dotnet(cmdArgs.contains(CmdArgs::silent)) &&
!cmdArgs.contains(CmdArgs::silent))
try
{
notifications::show_toast(DOTNET_INSTALL_ERROR, TOAST_TITLE);
if (installDotnet &&
!updating::dotnet_is_installed() &&
!updating::install_dotnet(cmdArgs.contains(CmdArgs::silent)) &&
!cmdArgs.contains(CmdArgs::silent))
{
notifications::show_toast(DOTNET_INSTALL_ERROR, TOAST_TITLE);
}
}
catch (...)
{
MessageBoxW(nullptr, L".NET Core installation", L"Unknown exception encountered!", MB_OK | MB_ICONERROR);
}
updateProgressBar(.75f, INSTALLING_NEW_VERSION);
@@ -294,3 +303,27 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
return 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
return bootstrapper();
}
catch (const std::exception& ex)
{
MessageBoxA(nullptr, ex.what(), "Unhandled stdexception encountered!", MB_OK | MB_ICONERROR);
}
catch (winrt::hresult_error const& ex)
{
winrt::hstring message = ex.message();
MessageBoxW(nullptr, message.c_str(), L"Unhandled winrt exception encountered!", MB_OK | MB_ICONERROR);
}
catch (...)
{
auto lastErrorMessage = get_last_error_message(GetLastError());
std::wstring message = lastErrorMessage ? std::move(*lastErrorMessage) : L"";
MessageBoxW(nullptr, message.c_str(), L"Unknown exception encountered!", MB_OK | MB_ICONERROR);
}
return 0;
}

View File

@@ -1,5 +1,6 @@
#pragma once
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <shellapi.h>

View File

@@ -403,8 +403,13 @@ void notifications::show_toast_with_activations(std::wstring message,
}
}
}
notifier.Show(notification);
try
{
notifier.Show(notification);
}
catch (...)
{
}
}
void notifications::update_progress_bar_toast(std::wstring_view tag, progress_bar_params params)

View File

@@ -27,15 +27,21 @@ inline std::vector<wil::unique_process_handle> getProcessHandlesByName(const std
handleAccess |= PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ;
for (const DWORD processId : processIds)
{
wil::unique_process_handle hProcess{ OpenProcess(handleAccess, FALSE, processId) };
wchar_t name[MAX_PATH + 1];
if (!hProcess || !GetProcessImageFileNameW(hProcess.get(), name, MAX_PATH))
try
{
continue;
wil::unique_process_handle hProcess{ OpenProcess(handleAccess, FALSE, processId) };
wchar_t name[MAX_PATH + 1];
if (!hProcess || !GetProcessImageFileNameW(hProcess.get(), name, MAX_PATH))
{
continue;
}
if (processName == PathFindFileNameW(name))
{
result.push_back(std::move(hProcess));
}
}
if (processName == PathFindFileNameW(name))
catch (...)
{
result.push_back(std::move(hProcess));
}
}
return result;