нерабочий пример сохранения части экрана в bmp

Тема в разделе "WASM.BEGINNERS", создана пользователем Vitaly747_007, 27 июн 2011.

  1. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    Добрый день!
    Без успешно пытаюсь переделать фасмовый пример сохранения части экрана в масмовый.
    Нет возможности проверить фасмовый исходник, но думаю что он рабочий.
    Помогите разобраться. вот fasm пример
    Код (Text):
    1. include 'C:\Program files\fasm\include\win32ax.inc'
    2.  
    3. .data
    4.  
    5. struct RGBQUAD
    6. rgbBlue db ?
    7. rgbGreen db ?
    8. rgbRed db ?
    9. rgbReserved db ?
    10. ends
    11.  
    12. struct BITMAPINFO
    13. bmiHeader BITMAPINFOHEADER ?
    14. bmiColors RGBQUAD ?
    15. ends
    16. bi24BitInfo BITMAPINFO ?
    17.  
    18. cabMain db 0x42,0x4D,0xC6,0x5F,0x01,00,00,00,00,00,0x36,00,00 ,00
    19. iDC dd ? ; La imagen original
    20. iBitmap dd ? ; La imagen de menor tamaño
    21. hanCaptura dd ? ; El handle del archivo donde guardaremos la captura
    22. bEscritos dd ? ; Necesario para poder escribir en el archivo
    23. bBytes dd ? ; Puntero al buffer de bytes
    24.  
    25. .code
    26.  
    27. start:
    28.  
    29. ; Inicializamos las estructuras
    30. mov [bi24BitInfo.bmiHeader.biBitCount],24
    31. mov [bi24BitInfo.bmiHeader.biCompression], 0
    32. mov [bi24BitInfo.bmiHeader.biPlanes], 1
    33. mov [bi24BitInfo.bmiHeader.biSize], 40
    34. mov [bi24BitInfo.bmiHeader.biWidth], 800
    35. mov [bi24BitInfo.bmiHeader.biHeight], 600
    36.  
    37.  
    38. ; Asignamos a nuestro dc un "hueco donde pintar"
    39. invoke CreateCompatibleDC, 0
    40. mov [iDC], eax
    41. invoke CreateDIBSection, [iDC], bi24BitInfo, 0, 0, 0, 0
    42. mov [iBitmap], eax
    43. invoke SelectObject, [iDC], [iBitmap]
    44.  
    45. ; Obtenemos la captura y la reducimos
    46. invoke LocalAlloc, LPTR, 1440000 ; 1440000 = 800 * 600 * 3
    47. mov [bBytes], eax
    48. invoke GetDC, 0
    49. invoke StretchBlt, [iDC], 0, 0, 800, 600, eax, 0, 0, 1152, 864, 0xCC0020
    50. invoke GetDIBits, [iDC], [iBitmap], 0, 600, [bBytes], bi24BitInfo, 0
    51.  
    52.  
    53.  
    54. ; Guardamos el archivo
    55. invoke CreateFile, 'C:\cap.bmp', GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0
    56. mov [hanCaptura], eax
    57. invoke WriteFile, [hanCaptura], cabMain, 14, bEscritos, NULL
    58. invoke WriteFile, [hanCaptura], bi24BitInfo, 40, bEscritos, NULL
    59. invoke WriteFile, [hanCaptura], [bBytes], 1440000, bEscritos, NULL ; 1440000 = 800 * 600 * 3
    60. invoke CloseHandle, [hanCaptura]
    61.  
    62. ; Liberamos y salimos
    63. invoke DeleteDC, [iDC]
    64. invoke DeleteObject, [iBitmap]
    65. invoke LocalFree, [iBitmap]
    66. invoke LocalFree, [bBytes]
    67. invoke ExitProcess, 0
    68.  
    69.  
    70.  
    71. .end start
    вот то что я намудрил для компилятора masm32
    Код (Text):
    1.         .386
    2.         .model flat,stdcall
    3.         option casemap:none   ; case sensitive
    4.         include \masm32\include\windows.inc
    5.         include \masm32\include\user32.inc
    6.         include \masm32\include\kernel32.inc
    7.         include \masm32\include\gdi32.inc
    8.         includelib \masm32\lib\user32.lib
    9.         includelib \masm32\lib\kernel32.lib
    10.         includelib \masm32\lib\gdi32.lib
    11. ; --------------------------------------------------------
    12. .data
    13. InfoStr db 042h,04Dh,09Ah,051h,01h,00h,00h,00h,00h,00h,036h,00h,00h,00h
    14. Nam     db "img.bmp",0
    15. ;---------------------------------------------------------
    16. .data?
    17. BMap dd                     ?
    18. hend  dd                     ?
    19. Mem  dd 14400 dup(?)
    20. rzv     dd                      ?
    21. ;---------------------------------------------------------
    22. .code
    23. start:
    24.  
    25. call SCR
    26. invoke Beep,3300, 250
    27. call ExitProcess
    28. ;~~~~~~~~~~~~~~~~~~~~~
    29. SCR proc
    30.  
    31. LOCAL hDC:DWORD
    32. LOCAL BMP:BITMAPINFO
    33. LOCAL sss:BITMAPCOREHEADER
    34. LOCAL yyy:RGBQUAD
    35.  
    36. mov sss.bcBitCount, 24
    37. mov sss.bcSize, 40
    38. mov sss.bcWidth, 80
    39. mov sss.bcHeight, 60
    40. mov sss.bcPlanes, 1
    41.  
    42. mov yyy.rgbBlue,0
    43. mov yyy.rgbGreen,0
    44. mov yyy.rgbRed,0
    45. mov yyy.rgbReserved,0
    46.  
    47. push sss
    48. pop BMP.bmiHeader
    49. push yyy
    50. pop BMP.bmiColors
    51.  
    52. invoke GetDC,0
    53. mov hDC,eax
    54. invoke GetObject,hDC, 14400, addr Mem
    55. invoke CreateDIBSection, hDC, addr BMP, DIB_RGB_COLORS, addr Mem, HBITMAP, 0
    56. mov BMap, eax
    57. invoke SelectObject, hDC, BMap
    58. invoke GetDIBits, hDC, BMap, 0, 60, addr Mem, addr BMP, 0
    59.  
    60. invoke CreateFile, addr Nam, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    61. mov hend, eax
    62. invoke WriteFile, hend, addr InfoStr, 14,        addr rzv, NULL
    63. invoke WriteFile, hend, addr BMP,      40,        addr rzv, NULL
    64. invoke WriteFile, hend, addr Mem,     14400, addr rzv, NULL
    65.  
    66. invoke CloseHandle, hend
    67. invoke DeleteDC, hDC
    68. invoke DeleteObject, BMap
    69.  
    70. ret
    71. SCR endp
    72. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    73. end start
     
  2. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    вобщем почемуто не пишется в файл все что после 14-го байта. есть подозрение что структура BITMAPINFO неверно задана или неверно передана.
     
  3. eispickel

    eispickel New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2011
    Сообщения:
    1
    Приветствую тебя в своей иллюзии, Vitaly747_007!

    Первое. Исходник на fasm полностью рабочий, проверил.

    Второе.
    Я конечно, могу ошибаться но...
    Ты уже определил локальную переменную типа BITMAPINFO, она УЖЕ содержит в себе и структуру BITMAPCOREHEADER и RGBQUAD. Зачем ты вводишь ещё две переменные с такими типами?
    Вот этого не надо:
    Код (Text):
    1. push sss
    2. pop BMP.bmiHeader
    3. push yyy
    4. pop BMP.bmiColors
    По-моему, так ты передашь не значения структур, а их адреса, которые запишутся вместо значений. Проще всего посмотреть под отладчиком.
    Заполни поля как в fasm-исходнике и должно вроде сработать.

    У меня ситуация обратная - нет masm-a под рукой :). Удачи!
     
  4. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    нее, она будет пуста пока в нее что-то не положиш.
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    BMP 800*600 без сжатия ни при каких условиях не может весить 14400 байт. Два нолика добавь.
     
  6. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    я их уменьшил до 80 и 60.
     
  7. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Vitaly747_007, а вот эти строчки
    Код (Text):
    1. invoke GetDC,0
    2. mov hDC,eax
    3. invoke GetObject,hDC, 14400, addr Mem
    об этом знают? В оригинале-то StretchBlt и без всяких GetObject, а что ты получишь в свой буфер - вопрос более, чем философский. Попробуй туда честно написать sizeof(BITMAP), а то мало ли.
     
  8. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    больше меня удивляет то, что в файл совсем ничего не попадает с 14 байта. хотяб часть картины должна-же? GetObject убрал, нчего не изменилось
     
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    В общем, у меня в отладчике GetObject после GetDC возвращает 0, т.е. заморочка именно в нём.

    PS Ну да, c DeviceContext оно работать и не должно. Нужно выбрать какой-нибудь другой способ получения размеров экрана.
     
  10. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    выложите пожалуйста кто-нибудь екзешник сделанный FASM
     
  11. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
  12. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    странно, он у меня в винд.7 не работает(
    значит возможно иногда было все верно, но по какойто другой причине неработало.
    в ХР на том-же железе все работает. значит проблема в вин7
     
  13. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Всё там работает. Просто в семёрке запись в корень несъёмного диска запрещена по умолчанию.
     
  14. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    ...как и предпологал проблема наверн в неверном заполнении структуры BITMAPINFO
    пошол корявым путем и все получилось, вот пример если кому пригодится:
    Код (Text):
    1.         .386
    2.         .model flat,stdcall
    3.         option casemap:none   ; case sensitive
    4.         include \masm32\include\windows.inc
    5.         include \masm32\include\user32.inc
    6.         include \masm32\include\kernel32.inc
    7.         include \masm32\include\gdi32.inc
    8.         includelib \masm32\lib\user32.lib
    9.         includelib \masm32\lib\kernel32.lib
    10.         includelib \masm32\lib\gdi32.lib
    11. ; --------------------------------------------------------
    12. .data
    13. InfoStr db 042h,04Dh,0C6h,05Fh,01h,00h,00h,00h,00h,00h,036h,00h,00h,00h
    14. strBM db 028h, 00h, 00h, 00h, 020h, 03h, 00h, 00h, 058h, 02h, 00h, 00h, 01h, 00h, 018h, 00h, 00h, 00h, 00h, 00h, 00h, 0F9h, 015h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    15. Nam     db "img.bmp",0
    16. ;---------------------------------------------------------
    17. .data?
    18. BMap dd                     ?
    19. hend  dd                     ?
    20. Mem  dd                     ?
    21. rzv     dd                      ?
    22. ;---------------------------------------------------------
    23. .code
    24. start:
    25.  
    26. call SCR
    27. invoke Beep,3300, 250
    28. call ExitProcess
    29. ;~~~~~~~~~~~~~~~~~~~~~
    30. SCR proc
    31. LOCAL hDC1:DWORD
    32. LOCAL hDC:DWORD
    33.  
    34. invoke CreateCompatibleDC, 0
    35. mov hDC1, eax
    36. invoke CreateDIBSection, hDC1, addr strBM, 0, 0, 0, 0
    37. mov BMap, eax
    38. invoke SelectObject, hDC1, BMap
    39.  
    40. invoke LocalAlloc, 040h, 015f900h
    41. mov Mem, eax
    42.  
    43. invoke GetDC,0
    44. mov hDC,eax
    45.  
    46. invoke StretchBlt, hDC1, 0, 0, 0320h, 0258h, hDC, 0, 0, 0480h, 0360h, SRCCOPY
    47.  
    48. invoke GetDIBits, hDC1, BMap, 0, 0258h, Mem, addr strBM, 0
    49.  
    50. invoke CreateFile, addr Nam, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    51. mov hend, eax
    52. invoke WriteFile, hend, addr InfoStr, 14,        addr rzv, NULL
    53. invoke WriteFile, hend, addr strBM,      40,         addr rzv, NULL
    54. invoke WriteFile, hend, Mem,     015f900h,   addr rzv, NULL
    55.  
    56. invoke CloseHandle, hend
    57. invoke DeleteDC, hDC
    58. invoke DeleteObject, BMap
    59. invoke LocalFree, BMap
    60. invoke LocalFree, Mem
    61. ret
    62. SCR endp
    63. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    64. end start
    Кто знает как синтаксисом масма заполнить BITMAPINFO ?
     
  15. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    ....да я просто перепутал структуры)))))надо BITMAPINFOHEADER а я BITMAPCOREHEADER
    откудато взял...
    все заработало, всем спасибо!

    Код (Text):
    1.         .386
    2.         .model flat,stdcall
    3.         option casemap:none   ; case sensitive
    4.         include \masm32\include\windows.inc
    5.         include \masm32\include\user32.inc
    6.         include \masm32\include\kernel32.inc
    7.         include \masm32\include\gdi32.inc
    8.         includelib \masm32\lib\user32.lib
    9.         includelib \masm32\lib\kernel32.lib
    10.         includelib \masm32\lib\gdi32.lib
    11. ; --------------------------------------------------------
    12. .data
    13. InfoStr db 042h,04Dh,036h,020h,01Ch,00h,00h,00h,00h,00h,036h,00h,00h,00h
    14. Nam     db "img.bmp",0
    15. ;---------------------------------------------------------
    16. .data?
    17. BMap dd                     ?
    18. hend  dd                     ?
    19. Mem  dd                     ?
    20. rzv     dd                      ?
    21. ;---------------------------------------------------------
    22. .code
    23. start:
    24.  
    25. call SCR
    26. invoke Beep,3300, 250
    27. call ExitProcess
    28. ;~~~~~~~~~~~~~~~~~~~~~
    29. SCR proc
    30. LOCAL hDC1:DWORD
    31. LOCAL hDC:DWORD
    32. LOCAL bmpinf:BITMAPINFOHEADER
    33.  
    34. mov bmpinf.biBitCount, 24
    35. mov bmpinf.biSize, 40
    36. mov bmpinf.biWidth, 800
    37. mov bmpinf.biHeight, 600
    38. mov bmpinf.biPlanes, 1
    39. mov bmpinf.biCompression,0
    40.  
    41.  
    42. invoke CreateCompatibleDC, 0
    43. mov hDC1, eax
    44. invoke CreateDIBSection, hDC1, addr bmpinf, 0, 0, 0, 0
    45. mov BMap, eax
    46. invoke SelectObject, hDC1, BMap
    47.  
    48. invoke LocalAlloc, 040h, 015f900h
    49. mov Mem, eax
    50.  
    51. invoke GetDC,0
    52. mov hDC,eax
    53.  
    54. invoke StretchBlt, hDC1, 0, 0, 800, 600, hDC, 0, 0, 800, 600, SRCCOPY
    55.  
    56. invoke GetDIBits, hDC1, BMap, 0, 600, Mem, addr bmpinf, 0
    57.  
    58. invoke CreateFile, addr Nam, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    59. mov hend, eax
    60. invoke WriteFile, hend, addr InfoStr, 14,        addr rzv, NULL
    61. invoke WriteFile, hend, addr bmpinf,      40,         addr rzv, NULL
    62. invoke WriteFile, hend, Mem,     015f900h,   addr rzv, NULL
    63.  
    64. invoke CloseHandle, hend
    65. invoke DeleteDC, hDC
    66. invoke DeleteObject, BMap
    67. invoke LocalFree, BMap
    68. invoke LocalFree, Mem
    69. ret
    70. SCR endp
    71. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    72. end start