Здравствуйте! Не подскажете, почему не получается создать семафор. Пример компилируется, но сколько бы копий не было, мессадж вываливается, хотя при запуске второй копии файла, по идее не должен... Код (Text): .386 .model flat,stdcall option casemap:none include WINDOWS.INC include KERNEL32.INC include USER32.INC include ADVAPI32.INC includelib comctl32.lib includelib user32.lib includelib gdi32.lib includelib kernel32.lib includelib user32.lib includelib advapi32.lib ;data--data--data--data--data .DATA hInstance HINSTANCE ? string db "semafor",0 sem dd ? ;code--code--code--code--code ;<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;code--code--code--code--code .CODE START: invoke GetModuleHandle,0 ; Получаем дескриптор программы mov hInstance,eax ; Записываем его в переменную hInstance invoke CreateSemaphore,0,0,1,addr string .if eax==0 jmp Quit .else invoke MessageBox,0,addr string,addr string,0 .endif Quit: invoke ExitProcess , 0 END START
tuip Обьект будет создан или открыт независимо от числа вызовов. Тогда ядро возвращает статус STATUS_OBJECT_NAME_EXISTS(для именованных обьектов, они глобальны). Это для любого обьекта имеет смысл, хоть семафор, хоть поток. Далее состояние семафора может быть определено, для этого винапи нет соответствующей NtQuerySemaphore. При синхронизации поток захватывает семафор в функциях ожидания(WaitForSingleObject() etc.), если счётчик захватов исчерпан, то поток входит в ожижание освобождения семафора. Для одного экземпляра приложения нужно проверить статус при создании/открытии обьекта. Если винапи, то ERROR_ALREADY_EXISTS. Это очень плохой способ, можно попробывать открыть обьект.
Благодарю! Опыта у меня мало, не сразу понял написанное =) С функцией GetLastError работает вроде правильно.