Работа с атомами

Тема в разделе "WASM.BEGINNERS", создана пользователем random46, 24 мар 2007.

  1. random46

    random46 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2007
    Сообщения:
    6
    Здравствуйте, я сравнительно недавно познакомился с MASM32.
    Пробую работать с атомами, вот код, я его гонял под отладчиком - все
    функции почему-то возвращают нули!. Подскажите, пожалуйста, в чем тут дело, где ошибка?

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include C:\masm32\include\windows.inc
    5. include C:\masm32\include\kernel32.inc
    6. includelib C:\masm32\lib\kernel32.lib
    7.  
    8. .data
    9. AtomS  db "This is my atom", 0
    10.  
    11. .code
    12.  
    13. start:
    14.        invoke GlobalFindAtom, addr AtomS
    15.        invoke GlobalAddAtom, addr AtomS  ;Вместо ID Атома возвращает 0!
    16.        invoke GlobalFindAtom, addr AtomS
    17.        invoke GlobalDeleteAtom, eax      
    18.        invoke GlobalFindAtom, addr AtomS
    19. end start
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    GetLastError?
     
  3. random46

    random46 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2007
    Сообщения:
    6
    5 - Access is denied.
     
  4. random46

    random46 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2007
    Сообщения:
    6
    Почему?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    После какого вызова такой LastError?
    Приведи после GlobalAddAtom.
     
  6. random46

    random46 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2007
    Сообщения:
    6
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.     include C:\masm32\include\windows.inc
    5.     include C:\masm32\include\kernel32.inc
    6.     includelib C:\masm32\lib\kernel32.lib  
    7. .data
    8.     AtomS  db "Test atom string", 0
    9. .code
    10.    
    11. start:
    12.            invoke SetLastError, 0
    13.     invoke GlobalFindAtom, addr AtomS
    14.     invoke GlobalAddAtom, addr AtomS
    15.     invoke GetLastError                ;после вызова eax = 0x00000005 - Access denied
    16.     invoke GlobalFindAtom, addr AtomS
    17.     invoke GlobalDeleteAtom, eax
    18.     invoke GlobalFindAtom, addr AtomS
    19.     invoke ExitProcess, 0
    20. end start
    Может со строкой что то не то, потому что я проверил на делфи - атомы работают нормально
    Код (Text):
    1. var
    2.  AtomS:string = 'My atom string';
    3. ...
    4. hAtom := GlobalAddAtom(PChar(AtomS));
     
  7. random46

    random46 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2007
    Сообщения:
    6
    Да, и еще я наставил GetLastError после каждого вызова функций - они все возврашают код 5 - даже GlobalFindAtom.
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    random46
    Добавь User32.dll - у меня никто кроме GlobalDeleteAtom 0 не возвращает тогда.

    А для чего они вообще нужны, то в мсдн только описание функций, а область применения не ясна мне что-то.
     
  9. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    глобальные atom'ы живут вне зависимости от создавешй их программы! Простой экперимент - GlobalDeleteAtom не вызывать и при следующей запуске программы первая GlobalFindAtom выдаёт ненулевой результат! Причем reference cnt увеличивается каждый раз при GlobalAddAtom - вывод - использовать хороший стиль программирования) и удаляёте их столько же раз сколько создавали)
    [edit]
    у меня всё работет, правда на фасм переписал... user32 - лишняя ибо кернела достаточно.
     
  10. random46

    random46 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2007
    Сообщения:
    6
    Добавил user32, хотя функции и описаны в кернеле(и даже компилятор в начале хотел выкинуть
    user32 - оптимизация сработала), но почему-то после добавления всё заработало.
    Хотелось бы разобраться, в чем тут дело - я что то не могу проследить никакой связи? У меня MASM 8.2

    Да, GlobalDeleteAtom возвращает 0 если атом успешно удален - это нормально.

    To asmfan:
    Я фасма не знаю, не могли ли бы вы выложить ваш перевод - у меня есть этот компилятор - хочу поэксперементировать с ним.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
  12. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Да запросто:
    [added]
    Т.к. у меня всё работае - не стал прикручивать доп. библиотеки. Система - ХР SP2
     
  13. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    asmfan
    А у меня не работает. Тоже XP SP2
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    У меня работает. Тоже хр сп2. Проверял под Олли.
     
  15. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Тест атомов
     
  16. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Скажите мне глупому, для чего они вообще нужны,
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Можно как мьютексы использовать - для проверки единственности/уникальности экземпляра,
    Можно как разделяемую память (без нулей внутри - ибо строки принимает как параметры)
    Это всё для глобальных атомов. Когда регистрируешь класс окна, атом создаётся по имени класса - т.е. регистрация класса содержит в себе создание атома.
     
  18. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Ясно, спасибо.
    Учиться, учиться и т.д.