Не всегда работает GetObject.

Тема в разделе "WASM.WIN32", создана пользователем lord Kelvin, 8 май 2007.

  1. lord Kelvin

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia
    Эта программа при компиляции в fasm v1.67 не работает. В том смысле, что когда я смотрю ее под ollydbg GetObject вместо того, чтобы записать структуру BITMAP и вернуть 0x18, она ничего не делает и возвращает 0. Аналогичная программа на си, в вижуал студии работает на ура. Хочу добавить, что в фасме GetObject иногда работает
    Код (Text):
    1. format PE GUI 4.0
    2. include '..\include\win32a.inc'
    3.  
    4.         invoke LoadImage,0,FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
    5.         mov [hbmp],eax
    6.         invoke GetObject,[hbmp],sizeof.BITMAP,bm
    7.  
    8.         ret
    9.  
    10. FileName db 'cards\01.bmp',0
    11. hbmp dd ?
    12. bm BITMAP
    13.  
    14. data import
    15. library user32,'USER32',\
    16.         gdi32,'GDI32';,\
    17.  
    18. include '..\include\api\user32.inc'
    19. include '..\include\api\gdi32.inc'
    20.  
    21. end data
    Код, который чудом работает. Причем, если там добавить Sleep, то GetObject работает / не работает в зависимости от его параметра...
    Код (Text):
    1.         invoke GetDC,0
    2.         mov [hdc],eax
    3.  
    4.         invoke CreateCompatibleDC,[hdc]
    5.         mov [hmemdc],eax
    6.         invoke LoadImage,0,FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
    7.         mov [hbmp],eax
    8.         invoke SelectObject,[hmemdc],[hbmp]
    9.         invoke GetObject,[hbmp],sizeof.BITMAP,bm
    Прошу помочь разобраться, как заставить GetObject работать стабильно или объяснить, что я делаю / понял неправильно.
    Спасибо.
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    lord Kelvin
    В отладчике надо смотреть внимательнее. Баг может быть где угодно:
    LoadImage не загружает картинку.
    Переменная bm не доступна на запись.
    Формат структуры BITMAP обьявлен неправильно.
    Размер sizeof.BITMAP задан неправильно.
     
  3. n0name

    n0name New Member

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

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia
    sizeof.BITMAP, как надо 0x18.
    GetLastError возвращает 0 - без ошибок. Мое упущение, что не сказал. bm на запись открыта, но я перепроверю.
    Спасибо!
     
  5. lord Kelvin

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia
    Да. В bm запись разрешена. И LoadImage возвращает хендл картинки без ошибок.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у меня вышеприведенный код работает как и должен. Возвращает 18, в памяти что-то есть ;)
     
  7. lord Kelvin

    lord Kelvin New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    7
    Адрес:
    Russia
    Я попробовал использовать структуру, место под которую выделенно в стеке и все заработало стабильно. Quantum, n0name большое спасибо за желание помочь и быструю реакцию.
     
  8. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    lord Kelvin
    Получается, что перед bm BITMAP не хватало align 4 (строка 'cards\01.bmp' портит выравнивание). Странно.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ха, действительно, не заметил ;)
    У себя когда тестил 1.bmp юзал, что даёт 6 байт.