From 760d8a632ea1bdbd0a8f32e535746b141e180f87 Mon Sep 17 00:00:00 2001 From: Paravis Date: Sun, 8 Nov 2026 23:25:03 +0300 Subject: [PATCH] Block second instance --- README.md | 2 ++ src/main.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/README.md b/README.md index c1e6f42..ebdab15 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ build\Release\ParavisInstaller.exe PARAVIS и немедленный выход. - Если рядом с установщиком есть `Change_BootLoader.exe`, он копируется на раздел PARAVIS после распаковки и используется вместо копии из `Data.pf`. +- Повторный запуск установщика запрещён: второй экземпляр активирует уже + открытое окно и сразу завершается. - Служебные режимы: `/selftest`, `/verify=N`, `/testdisk=N`, `/wim=путь`. ## Примечания diff --git a/src/main.cpp b/src/main.cpp index 14af42b..7e8aa5f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -975,6 +975,23 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int) } } + HANDLE instanceMutex = CreateMutexW(nullptr, FALSE, + L"Local\\ParavisInstaller_SingleInstance"); + if (instanceMutex && GetLastError() == ERROR_ALREADY_EXISTS) { + HWND existing = FindWindowW(kMainClass, nullptr); + if (existing) { + if (IsIconic(existing)) { + ShowWindow(existing, SW_RESTORE); + } + SetForegroundWindow(existing); + } else { + MessageBoxW(nullptr, L"Paravis installer уже запущен.", + L"Paravis installer", MB_ICONINFORMATION | MB_OK); + } + CloseHandle(instanceMutex); + return 0; + } + INITCOMMONCONTROLSEX commonControls{}; commonControls.dwSize = sizeof(commonControls); commonControls.dwICC = ICC_PROGRESS_CLASS | ICC_STANDARD_CLASSES;