m32.lib: BitmapFromFile

Тема в разделе "WASM.WIN32", создана пользователем mc black, 3 дек 2005.

  1. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Здравствуйте, уважаемые обитатели форума!



    Тут только узнал о функции masm32.lib BitmapFromFile, но в моём тестовом примере она, к сожалению, возвращает 0, т.е. ошибку. Пример мой в аттачменте. По сути что мне было нужно: загружать в окно картинки из файлов в сжатых форматах jpg и gif. Вот отрезок кода для тех, кому не хочется качать и распаковывать (заранее прошу прощения за ламерский вопрос):
    Код (Text):
    1.  
    2. PaintProc proc hWnd:DWORD
    3.     LOCAL hDC :DWORD
    4.     LOCAL hOld :DWORD
    5.     LOCAL memDC :DWORD
    6.     LOCAL ps :PAINTSTRUCT
    7.     invoke BeginPaint,hWnd,addr ps
    8.     mov hDC,eax
    9.     invoke CreateCompatibleDC,hDC
    10.     mov memDC,eax
    11.     invoke SelectObject,memDC,hBmp
    12.     mov hOld,eax
    13.     invoke BitBlt,hDC,0,0,470,378,memDC,0,0,SRCCOPY
    14.     invoke SelectObject,hDC,hOld
    15.     invoke DeleteDC,memDC
    16.     invoke EndPaint,hWnd,addr ps
    17.     ret
    18. PaintProc endp
    19. WndProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    20.     .if uMsg==WM_CREATE
    21.         invoke BitmapFromFile,addr szFileName
    22.         .if eax==0
    23.             invoke MessageBox,hWnd,0,0,MB_OK
    24.         .else
    25.             mov hBmp,eax
    26.         .endif
    27.     .elseif uMsg==WM_PAINT
    28.         invoke PaintProc,hWnd
    29.     .elseif uMsg==WM_CLOSE
    30.         invoke DestroyWindow,hWnd
    31.     .elseif uMsg==WM_DESTROY
    32.         invoke PostQuitMessage,0
    33.     .else
    34.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    35.         ret
    36.     .endif
    37.     xor eax,eax
    38.     ret
    39. WndProc endp




    [​IMG] 263267197__img.zip
     
  2. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    ну во-первых, не указана версия масма, во-вторых, там вроде баг, попробуй либу из аттача



    [​IMG] _1016084219__imagelib5.zip
     
  3. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Avoidik

    Моя версия Masm32 v8.2 sp2. Мой пример почти передран с примера, поставленного с masm32:

    \masm32\examples\EXAMPLE9\CAR\ Обязательно разберусь с примером, что ты мне прислал, большой спасибо! Кажется как раз это мне было и нужно.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Бага заключается в двойном освобождении одного куска памяти. Прога грохается обычно на выходе. В ф-ции BitmapFromMemory (она вызывается из BitmapFromFile) надо закомментировать (или удалить)

    invoke CoTaskMemFree, pGlobal ; free task memory

    которая следует сразу за

    invoke CoUninitialize ; all done with COM

    После этого либо перекомпилить либу, либо просто взять и включить в свой исходник исправленные ф-ции живьём.
     
  5. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Как классно! Всё всё знают! В общем я просто взял либу, что дал Avoidik, перекомпилировал, разложил то, что имеется по папкам lib, include и этим пока остался доволен. Спасибо и cresta, возможно я так и сделаю, как ты сказал. Просто как-то странно, что такие достаточно часто востребованные функции до сих пор так и остались неисправленными, с багами в masm32 v8.2 sp2 (!). Надеюсь в следующем sp или новой версии этого больше не увидеть.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    mc black

    Кстати, твой код рабочий :)

    Если бы ты проверил, почему BitmapFromFile возвращает ноль, например так:



    invoke BitmapFromFile,addr szFileName

    PrintError



    то в дебаговом окошке отобразилось бы:

    Не удается найти указанный файл.



    Надо было просто указать полный путь к файлу .jpg.

    Возможно потому, что имя файла преобразовывается в юникод перед вызовом OleLoadPicturePath, и тут возможно происходит накладка.