Добрый день! Без успешно пытаюсь переделать фасмовый пример сохранения части экрана в масмовый. Нет возможности проверить фасмовый исходник, но думаю что он рабочий. Помогите разобраться. вот fasm пример Код (Text): include 'C:\Program files\fasm\include\win32ax.inc' .data struct RGBQUAD rgbBlue db ? rgbGreen db ? rgbRed db ? rgbReserved db ? ends struct BITMAPINFO bmiHeader BITMAPINFOHEADER ? bmiColors RGBQUAD ? ends bi24BitInfo BITMAPINFO ? cabMain db 0x42,0x4D,0xC6,0x5F,0x01,00,00,00,00,00,0x36,00,00 ,00 iDC dd ? ; La imagen original iBitmap dd ? ; La imagen de menor tamaño hanCaptura dd ? ; El handle del archivo donde guardaremos la captura bEscritos dd ? ; Necesario para poder escribir en el archivo bBytes dd ? ; Puntero al buffer de bytes .code start: ; Inicializamos las estructuras mov [bi24BitInfo.bmiHeader.biBitCount],24 mov [bi24BitInfo.bmiHeader.biCompression], 0 mov [bi24BitInfo.bmiHeader.biPlanes], 1 mov [bi24BitInfo.bmiHeader.biSize], 40 mov [bi24BitInfo.bmiHeader.biWidth], 800 mov [bi24BitInfo.bmiHeader.biHeight], 600 ; Asignamos a nuestro dc un "hueco donde pintar" invoke CreateCompatibleDC, 0 mov [iDC], eax invoke CreateDIBSection, [iDC], bi24BitInfo, 0, 0, 0, 0 mov [iBitmap], eax invoke SelectObject, [iDC], [iBitmap] ; Obtenemos la captura y la reducimos invoke LocalAlloc, LPTR, 1440000 ; 1440000 = 800 * 600 * 3 mov [bBytes], eax invoke GetDC, 0 invoke StretchBlt, [iDC], 0, 0, 800, 600, eax, 0, 0, 1152, 864, 0xCC0020 invoke GetDIBits, [iDC], [iBitmap], 0, 600, [bBytes], bi24BitInfo, 0 ; Guardamos el archivo invoke CreateFile, 'C:\cap.bmp', GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 mov [hanCaptura], eax invoke WriteFile, [hanCaptura], cabMain, 14, bEscritos, NULL invoke WriteFile, [hanCaptura], bi24BitInfo, 40, bEscritos, NULL invoke WriteFile, [hanCaptura], [bBytes], 1440000, bEscritos, NULL ; 1440000 = 800 * 600 * 3 invoke CloseHandle, [hanCaptura] ; Liberamos y salimos invoke DeleteDC, [iDC] invoke DeleteObject, [iBitmap] invoke LocalFree, [iBitmap] invoke LocalFree, [bBytes] invoke ExitProcess, 0 .end start вот то что я намудрил для компилятора masm32 Код (Text): .386 .model flat,stdcall option casemap:none ; case sensitive include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib ; -------------------------------------------------------- .data InfoStr db 042h,04Dh,09Ah,051h,01h,00h,00h,00h,00h,00h,036h,00h,00h,00h Nam db "img.bmp",0 ;--------------------------------------------------------- .data? BMap dd ? hend dd ? Mem dd 14400 dup(?) rzv dd ? ;--------------------------------------------------------- .code start: call SCR invoke Beep,3300, 250 call ExitProcess ;~~~~~~~~~~~~~~~~~~~~~ SCR proc LOCAL hDC:DWORD LOCAL BMP:BITMAPINFO LOCAL sss:BITMAPCOREHEADER LOCAL yyy:RGBQUAD mov sss.bcBitCount, 24 mov sss.bcSize, 40 mov sss.bcWidth, 80 mov sss.bcHeight, 60 mov sss.bcPlanes, 1 mov yyy.rgbBlue,0 mov yyy.rgbGreen,0 mov yyy.rgbRed,0 mov yyy.rgbReserved,0 push sss pop BMP.bmiHeader push yyy pop BMP.bmiColors invoke GetDC,0 mov hDC,eax invoke GetObject,hDC, 14400, addr Mem invoke CreateDIBSection, hDC, addr BMP, DIB_RGB_COLORS, addr Mem, HBITMAP, 0 mov BMap, eax invoke SelectObject, hDC, BMap invoke GetDIBits, hDC, BMap, 0, 60, addr Mem, addr BMP, 0 invoke CreateFile, addr Nam, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 mov hend, eax invoke WriteFile, hend, addr InfoStr, 14, addr rzv, NULL invoke WriteFile, hend, addr BMP, 40, addr rzv, NULL invoke WriteFile, hend, addr Mem, 14400, addr rzv, NULL invoke CloseHandle, hend invoke DeleteDC, hDC invoke DeleteObject, BMap ret SCR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end start
вобщем почемуто не пишется в файл все что после 14-го байта. есть подозрение что структура BITMAPINFO неверно задана или неверно передана.
Приветствую тебя в своей иллюзии, Vitaly747_007! Первое. Исходник на fasm полностью рабочий, проверил. Второе. Я конечно, могу ошибаться но... Ты уже определил локальную переменную типа BITMAPINFO, она УЖЕ содержит в себе и структуру BITMAPCOREHEADER и RGBQUAD. Зачем ты вводишь ещё две переменные с такими типами? Вот этого не надо: Код (Text): push sss pop BMP.bmiHeader push yyy pop BMP.bmiColors По-моему, так ты передашь не значения структур, а их адреса, которые запишутся вместо значений. Проще всего посмотреть под отладчиком. Заполни поля как в fasm-исходнике и должно вроде сработать. У меня ситуация обратная - нет masm-a под рукой . Удачи!
Vitaly747_007, а вот эти строчки Код (Text): invoke GetDC,0 mov hDC,eax invoke GetObject,hDC, 14400, addr Mem об этом знают? В оригинале-то StretchBlt и без всяких GetObject, а что ты получишь в свой буфер - вопрос более, чем философский. Попробуй туда честно написать sizeof(BITMAP), а то мало ли.
больше меня удивляет то, что в файл совсем ничего не попадает с 14 байта. хотяб часть картины должна-же? GetObject убрал, нчего не изменилось
В общем, у меня в отладчике GetObject после GetDC возвращает 0, т.е. заморочка именно в нём. PS Ну да, c DeviceContext оно работать и не должно. Нужно выбрать какой-нибудь другой способ получения размеров экрана.
странно, он у меня в винд.7 не работает( значит возможно иногда было все верно, но по какойто другой причине неработало. в ХР на том-же железе все работает. значит проблема в вин7
...как и предпологал проблема наверн в неверном заполнении структуры BITMAPINFO пошол корявым путем и все получилось, вот пример если кому пригодится: Код (Text): .386 .model flat,stdcall option casemap:none ; case sensitive include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib ; -------------------------------------------------------- .data InfoStr db 042h,04Dh,0C6h,05Fh,01h,00h,00h,00h,00h,00h,036h,00h,00h,00h 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 Nam db "img.bmp",0 ;--------------------------------------------------------- .data? BMap dd ? hend dd ? Mem dd ? rzv dd ? ;--------------------------------------------------------- .code start: call SCR invoke Beep,3300, 250 call ExitProcess ;~~~~~~~~~~~~~~~~~~~~~ SCR proc LOCAL hDC1:DWORD LOCAL hDC:DWORD invoke CreateCompatibleDC, 0 mov hDC1, eax invoke CreateDIBSection, hDC1, addr strBM, 0, 0, 0, 0 mov BMap, eax invoke SelectObject, hDC1, BMap invoke LocalAlloc, 040h, 015f900h mov Mem, eax invoke GetDC,0 mov hDC,eax invoke StretchBlt, hDC1, 0, 0, 0320h, 0258h, hDC, 0, 0, 0480h, 0360h, SRCCOPY invoke GetDIBits, hDC1, BMap, 0, 0258h, Mem, addr strBM, 0 invoke CreateFile, addr Nam, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 mov hend, eax invoke WriteFile, hend, addr InfoStr, 14, addr rzv, NULL invoke WriteFile, hend, addr strBM, 40, addr rzv, NULL invoke WriteFile, hend, Mem, 015f900h, addr rzv, NULL invoke CloseHandle, hend invoke DeleteDC, hDC invoke DeleteObject, BMap invoke LocalFree, BMap invoke LocalFree, Mem ret SCR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end start Кто знает как синтаксисом масма заполнить BITMAPINFO ?
....да я просто перепутал структуры)))))надо BITMAPINFOHEADER а я BITMAPCOREHEADER откудато взял... все заработало, всем спасибо! Код (Text): .386 .model flat,stdcall option casemap:none ; case sensitive include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib ; -------------------------------------------------------- .data InfoStr db 042h,04Dh,036h,020h,01Ch,00h,00h,00h,00h,00h,036h,00h,00h,00h Nam db "img.bmp",0 ;--------------------------------------------------------- .data? BMap dd ? hend dd ? Mem dd ? rzv dd ? ;--------------------------------------------------------- .code start: call SCR invoke Beep,3300, 250 call ExitProcess ;~~~~~~~~~~~~~~~~~~~~~ SCR proc LOCAL hDC1:DWORD LOCAL hDC:DWORD LOCAL bmpinf:BITMAPINFOHEADER mov bmpinf.biBitCount, 24 mov bmpinf.biSize, 40 mov bmpinf.biWidth, 800 mov bmpinf.biHeight, 600 mov bmpinf.biPlanes, 1 mov bmpinf.biCompression,0 invoke CreateCompatibleDC, 0 mov hDC1, eax invoke CreateDIBSection, hDC1, addr bmpinf, 0, 0, 0, 0 mov BMap, eax invoke SelectObject, hDC1, BMap invoke LocalAlloc, 040h, 015f900h mov Mem, eax invoke GetDC,0 mov hDC,eax invoke StretchBlt, hDC1, 0, 0, 800, 600, hDC, 0, 0, 800, 600, SRCCOPY invoke GetDIBits, hDC1, BMap, 0, 600, Mem, addr bmpinf, 0 invoke CreateFile, addr Nam, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 mov hend, eax invoke WriteFile, hend, addr InfoStr, 14, addr rzv, NULL invoke WriteFile, hend, addr bmpinf, 40, addr rzv, NULL invoke WriteFile, hend, Mem, 015f900h, addr rzv, NULL invoke CloseHandle, hend invoke DeleteDC, hDC invoke DeleteObject, BMap invoke LocalFree, BMap invoke LocalFree, Mem ret SCR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end start