Здравствуйте
Столкнулся с ситуацией:
Есть код который компилируется как часть приложения 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;