Не получается с функцией CreateSemaphore

Тема в разделе "WASM.BEGINNERS", создана пользователем tuip, 19 окт 2010.

  1. tuip

    tuip New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2010
    Сообщения:
    4
    Здравствуйте!
    Не подскажете, почему не получается создать семафор. Пример компилируется, но сколько бы копий не было, мессадж вываливается, хотя при запуске второй копии файла, по идее не должен...

    Код (Text):
    1.           .386
    2.         .model flat,stdcall
    3.   option   casemap:none
    4.                         include WINDOWS.INC
    5.                         include KERNEL32.INC
    6.                         include USER32.INC
    7.                         include ADVAPI32.INC
    8.                                                                                                
    9.                         includelib comctl32.lib
    10.                         includelib user32.lib
    11.                         includelib gdi32.lib
    12.                         includelib kernel32.lib                
    13.                         includelib user32.lib
    14.                         includelib advapi32.lib      
    15.  
    16.  
    17.  
    18. ;data--data--data--data--data
    19.  
    20. .DATA
    21.        
    22.         hInstance HINSTANCE ?
    23.         string db "semafor",0
    24.         sem dd ?
    25.        
    26. ;code--code--code--code--code
    27. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    28. ;code--code--code--code--code
    29. .CODE  
    30. START:
    31.         invoke GetModuleHandle,0  ; Получаем дескриптор программы
    32.         mov hInstance,eax     ; Записываем его в переменную hInstance
    33.                       invoke CreateSemaphore,0,0,1,addr string
    34.                       .if eax==0
    35.           jmp Quit
    36.         .else
    37.           invoke MessageBox,0,addr string,addr string,0
    38.         .endif
    39.  
    40.         Quit:
    41.        
    42.         invoke               ExitProcess        ,       0
    43.  
    44. END  START
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    tuip
    Обьект будет создан или открыт независимо от числа вызовов. Тогда ядро возвращает статус STATUS_OBJECT_NAME_EXISTS(для именованных обьектов, они глобальны). Это для любого обьекта имеет смысл, хоть семафор, хоть поток. Далее состояние семафора может быть определено, для этого винапи нет соответствующей NtQuerySemaphore. При синхронизации поток захватывает семафор в функциях ожидания(WaitForSingleObject() etc.), если счётчик захватов исчерпан, то поток входит в ожижание освобождения семафора.
    Для одного экземпляра приложения нужно проверить статус при создании/открытии обьекта. Если винапи, то ERROR_ALREADY_EXISTS. Это очень плохой способ, можно попробывать открыть обьект.
     
  3. tuip

    tuip New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2010
    Сообщения:
    4
    Благодарю! Опыта у меня мало, не сразу понял написанное =) С функцией GetLastError работает вроде правильно.