Ошибка GetDIBits
От: VVL Россия  
Дата: 12.04.02 07:29
Оценка:
Здравствуйте

Столкнулся с ситуацией:

Есть код который компилируется как часть приложения Win16 и Win32.
Функция генерирет DIB и после неких действий его удаляет.
Утечек памяти и GDI дескрипторов нет.
Но после серии вызовов(несколько тысяч) GetDIBits начинает стабильно возвращать 0.
При этом GetLastError() — Операция завершена успешно!

Для Win32 проблему удалось обойти через CreateDIBSection.
Но в Win16 проблема осталась.

Проблема повторяется на разных компьтерах под Windows 98,2000,ME.
Видео карты на компьтерах различных производителей.
Сталкивался ли кто с подобным?

С уважением Вячеслав


BITMAPINFO *ToBitmap(HDC hSDC,int width,int height)
DWORD imagesize=DWBound(width*3l)*(DWORD)height;
BITMAPINFO *lpbmi=(BITMAPINFO *)new HUGE BYTE[sizeof(BITMAPINFOHEADER)+imagesize];
if(!lpbmi)
    return NULL;

_fmemset(lpbmi,0,sizeof(BITMAPINFOHEADER));
lpbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
lpbmi->bmiHeader.biSizeImage=0;
lpbmi->bmiHeader.biWidth=width;
lpbmi->bmiHeader.biHeight=height;
lpbmi->bmiHeader.biPlanes=1;
lpbmi->bmiHeader.biBitCount=24;
lpbmi->bmiHeader.biCompression=BI_RGB;
HDC    hTmpDC=CreateCompatibleDC(hSDC);
if(hTmpDC)
{   HBITMAP hbm2=CreateCompatibleBitmap(hSDC,цшвер,height);
    if(hbm2)
    {    HBITMAP obm2=(HBITMAP)SelectObject(hTmpDC,hbm2);
        BitBlt(hTmp2,0,0,width,height,hSDC,0,0,SRCCOPY);
            SelectObject(hTmpDC,obm2);
        BYTE HUGE *lpbytes=(BYTE HUGE *)lpbmi+sizeof(BITMAPINFOHEADER);
        if(!GetDIBits(hTmpDC,hbm2,0,height,lpbytes,lpbmi,DIB_RGB_COLORS))
        {    DWORD dwerr=GetLastError();
            /*....
            FormatMessage+MessageBox
            */
            delete []((BYTE HUGE *)lpbmi);
                        lpbmi=NULL;
        }
        DeleteObject(hbm2);    
    }
    DeleteDC(hTmpDC);
}
return lpbmi;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.