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

Discussion in 'WASM.WIN32' started by lord Kelvin, May 8, 2007.

  1. lord Kelvin

    lord Kelvin New Member

    Blog Posts:
    0
    Эта программа при компиляции в fasm v1.67 не работает. В том смысле, что когда я смотрю ее под ollydbg GetObject вместо того, чтобы записать структуру BITMAP и вернуть 0x18, она ничего не делает и возвращает 0. Аналогичная программа на си, в вижуал студии работает на ура. Хочу добавить, что в фасме GetObject иногда работает
    Code (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 работает / не работает в зависимости от его параметра...
    Code (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 Паладин дзена

    Blog Posts:
    0
    lord Kelvin
    В отладчике надо смотреть внимательнее. Баг может быть где угодно:
    LoadImage не загружает картинку.
    Переменная bm не доступна на запись.
    Формат структуры BITMAP обьявлен неправильно.
    Размер sizeof.BITMAP задан неправильно.
     
  3. n0name

    n0name New Member

    Blog Posts:
    0
    GetLastError в первом примере?
     
  4. lord Kelvin

    lord Kelvin New Member

    Blog Posts:
    0
    sizeof.BITMAP, как надо 0x18.
    GetLastError возвращает 0 - без ошибок. Мое упущение, что не сказал. bm на запись открыта, но я перепроверю.
    Спасибо!
     
  5. lord Kelvin

    lord Kelvin New Member

    Blog Posts:
    0
    Да. В bm запись разрешена. И LoadImage возвращает хендл картинки без ошибок.
     
  6. n0name

    n0name New Member

    Blog Posts:
    0
    у меня вышеприведенный код работает как и должен. Возвращает 18, в памяти что-то есть ;)
     
  7. lord Kelvin

    lord Kelvin New Member

    Blog Posts:
    0
    Я попробовал использовать структуру, место под которую выделенно в стеке и все заработало стабильно. Quantum, n0name большое спасибо за желание помочь и быструю реакцию.
     
  8. Quantum

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

    Blog Posts:
    0
    lord Kelvin
    Получается, что перед bm BITMAP не хватало align 4 (строка 'cards\01.bmp' портит выравнивание). Странно.
     
  9. n0name

    n0name New Member

    Blog Posts:
    0
    ха, действительно, не заметил ;)
    У себя когда тестил 1.bmp юзал, что даёт 6 байт.