Block second instance

This commit is contained in:
paravis committed 2026-11-08 23:25:03 +03:00
1 parent 3c807fbcf2
commit 760d8a632e
2 files changed
+19

No files matched your search

+2
View File
@@ -50,6 +50,8 @@ build\Release\ParavisInstaller.exe
PARAVIS и немедленный выход. PARAVIS и немедленный выход.
- Если рядом с установщиком есть `Change_BootLoader.exe`, он копируется на - Если рядом с установщиком есть `Change_BootLoader.exe`, он копируется на
раздел PARAVIS после распаковки и используется вместо копии из `Data.pf`. раздел PARAVIS после распаковки и используется вместо копии из `Data.pf`.
- Повторный запуск установщика запрещён: второй экземпляр активирует уже
открытое окно и сразу завершается.
- Служебные режимы: `/selftest`, `/verify=N`, `/testdisk=N`, `/wim=путь`. - Служебные режимы: `/selftest`, `/verify=N`, `/testdisk=N`, `/wim=путь`.
## Примечания ## Примечания
+17
View File
@@ -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{}; INITCOMMONCONTROLSEX commonControls{};
commonControls.dwSize = sizeof(commonControls); commonControls.dwSize = sizeof(commonControls);
commonControls.dwICC = ICC_PROGRESS_CLASS | ICC_STANDARD_CLASSES; commonControls.dwICC = ICC_PROGRESS_CLASS | ICC_STANDARD_CLASSES;