Привет! Как обычно, ничего не работает. По задаче нужно перезапустить собстенный процесс. Т.е. что бы осталась работать только дочерняя копия, а родительский завершился. Делаю так: Код (C): #include <iostream> #include <Windows.h> using namespace std; int main() { HANDLE hExit = CreateEventW(NULL, TRUE, FALSE, L"12345"); cout << "CreateEvent: " << hExit << endl; HANDLE mutex = CreateMutexW(NULL, FALSE, L"123"); cout << "CreateMutexW: " << mutex << endl; DWORD err = GetLastError(); if (err == ERROR_ALREADY_EXISTS) { cout << "ERROR_ALREADY_EXISTS\n"; SetEvent(hExit); } else { Sleep(3000); cout << "Create copy...\n"; STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); PROCESS_INFORMATION pi; if (CreateProcess(L"1.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi) == TRUE) { cout << "ProcessCreate OK\n"; } } SetEvent(hExit); cout << "WaitForSingleObject...\n"; if (WaitForSingleObject(hExit, 0) != WAIT_TIMEOUT) { ExitProcess(0); } cout << "OK!!!\n"; Sleep(10000); return 0; } Такое впечатление, что порожденный процесс не видит созданный мьютекс. Для того, что бы все работало, исполняемый файл должен называться 1.exe
Непонятно чего ты хочешь добиться нагородив эвентов и мутексов. Если процесс успешно создался можно смело завершать старый, новый пусть в цикле с OpenMutex ждет пока мутант исчезнет и создает свой, если тебе надо не больше одной копии процесса. Смотри в сторону lpMutexAttributes, который If this parameter is NULL, the handle cannot be inherited by child processes, хотя приведенный пример будет работать и с NULL, там не подразумевается передача хендла.
piligmindo, Обьект для ipc должен быть глобальным в системе. Иначе он уничтожается при окончании счётчика ссылок на него, те при завершении процесса.
Идея была такова: 1. запуск 1.ехе 2. 1.ехе запускает сам себя 3. "первый" 1.ехе завершается, второй работает Вы можете как то примерно показать на коде? А именованый мьютекс разве не глобальный системный обьект?
Код (ASM): invoke GetTickCount mov [nStartTickCount],eax pushdatanp db '123'\,0 SYNCHRONIZE = 0x100000 MUTANT_QUERY_STATE = 1 MUTANT_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED + SYNCHRONIZE + MUTANT_QUERY_STATE @@: invoke OpenMutexA,MUTANT_ALL_ACCESS,0,esp test eax,eax .if ~ZERO? invoke CloseHandle,eax invoke Sleep,50 invoke GetTickCount sub eax,[nStartTickCount] cmp eax,5000 jl @B .else invoke CreateMutexA,0,0,esp ... .endif popdata
piligmindo, Я не смотрел ваш код, обьект должен быть помечен перманентным, иначе хоть его видит система, но ядро его прикончит при завершении родителя.
f13nd, так если процесс запускает сам себя, то каждая копия будет крутить этот цикл... А как его пометить перманентным? И как потом убрать его?
Будет крутить 5 секунд, если мутекс никто не освободит пойдет лесом. Если освободят, займет одна копия. Самое тупое - ввести параметр командной строки, так вторая копия поймет, что запущена в качестве второй копии, для этого евенты не нужны. И мутексы тоже.
piligmindo, Винапи это оболочка вокруг ядерных функций, при этом происходит потеря гибкости. Параметры объекта задаются в общей для любого обьекта структуре OBJECT_ATTR. Наверно нужно посмотреть это https://docs.microsoft.com/ru-ru/windows/win32/termserv/kernel-object-namespaces
piligmindo, Нет не круто. Потеря гибкости значит что в параметрах винапи нет ядерной структуры, что бы прямо задать параметры обьекта. Наверно это делается через именование обьектов, либо есть спец апи, я не помню.
Как вариант можно создать переменную окружения, а вторым процессом ее удалить. (если вдруг не катит командная строка). А вообще вариантов масса. Например можно проверить кто родитель процесса. (ProcessEntry32.th32ParentProcessID)
TermoSINteZ, На процессе можно ждать, это тоже обьект. Вот только у тс не верное определение задачи. Мьютексы и семафоры используются для синхронизаций, а не для ipc. Обычная критическая секция может тоже быть глобальной. Смысл в том, что нужно создать обьект, который не завершается при завершении родителя. А синхронизации и вовсе не нужны. Как установить маркер в OA я хз. https://docs.microsoft.com/en-us/wi...licy-settings/create-permanent-shared-objects Есть для этого ядерная апи, можно посмотреть обёртку. Пусть тс это сделает сам. Рекомендовано изучать сурки нт, чтобы такие вопросы не появлялись.