Здравствуйте, я сравнительно недавно познакомился с MASM32. Пробую работать с атомами, вот код, я его гонял под отладчиком - все функции почему-то возвращают нули!. Подскажите, пожалуйста, в чем тут дело, где ошибка? Код (Text): .386 .model flat, stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\kernel32.lib .data AtomS db "This is my atom", 0 .code start: invoke GlobalFindAtom, addr AtomS invoke GlobalAddAtom, addr AtomS ;Вместо ID Атома возвращает 0! invoke GlobalFindAtom, addr AtomS invoke GlobalDeleteAtom, eax invoke GlobalFindAtom, addr AtomS end start
Код (Text): .386 .model flat, stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\kernel32.lib .data AtomS db "Test atom string", 0 .code start: invoke SetLastError, 0 invoke GlobalFindAtom, addr AtomS invoke GlobalAddAtom, addr AtomS invoke GetLastError ;после вызова eax = 0x00000005 - Access denied invoke GlobalFindAtom, addr AtomS invoke GlobalDeleteAtom, eax invoke GlobalFindAtom, addr AtomS invoke ExitProcess, 0 end start Может со строкой что то не то, потому что я проверил на делфи - атомы работают нормально Код (Text): var AtomS:string = 'My atom string'; ... hAtom := GlobalAddAtom(PChar(AtomS));
Да, и еще я наставил GetLastError после каждого вызова функций - они все возврашают код 5 - даже GlobalFindAtom.
random46 Добавь User32.dll - у меня никто кроме GlobalDeleteAtom 0 не возвращает тогда. А для чего они вообще нужны, то в мсдн только описание функций, а область применения не ясна мне что-то.
глобальные atom'ы живут вне зависимости от создавешй их программы! Простой экперимент - GlobalDeleteAtom не вызывать и при следующей запуске программы первая GlobalFindAtom выдаёт ненулевой результат! Причем reference cnt увеличивается каждый раз при GlobalAddAtom - вывод - использовать хороший стиль программирования) и удаляёте их столько же раз сколько создавали) [edit] у меня всё работет, правда на фасм переписал... user32 - лишняя ибо кернела достаточно.
Добавил user32, хотя функции и описаны в кернеле(и даже компилятор в начале хотел выкинуть user32 - оптимизация сработала), но почему-то после добавления всё заработало. Хотелось бы разобраться, в чем тут дело - я что то не могу проследить никакой связи? У меня MASM 8.2 Да, GlobalDeleteAtom возвращает 0 если атом успешно удален - это нормально. To asmfan: Я фасма не знаю, не могли ли бы вы выложить ваш перевод - у меня есть этот компилятор - хочу поэксперементировать с ним.
Да запросто: [added] Т.к. у меня всё работае - не стал прикручивать доп. библиотеки. Система - ХР SP2
Можно как мьютексы использовать - для проверки единственности/уникальности экземпляра, Можно как разделяемую память (без нулей внутри - ибо строки принимает как параметры) Это всё для глобальных атомов. Когда регистрируешь класс окна, атом создаётся по имени класса - т.е. регистрация класса содержит в себе создание атома.