Не пойму, что я не так делаю. Вроде бы всё по докам, а вот косяк...
код доставания массива битов такой:
bool CMy1Dlg::TakeScreenData()
{
CDialog* m_Dlg=this;
std::vector<BYTE> DATA;
bool bResult=false;
CDC* dc=0;
for(;;)
{
DATA.clear();
RECT dstRect;
m_Dlg->GetClientRect(&dstRect);
LONG wid=dstRect.right -dstRect.left+1;
LONG hig=dstRect.bottom-dstRect.top +1;
dc=m_Dlg->GetDC();
BITMAPINFO bi;
::memset(&bi,0,sizeof(bi));
bi.bmiHeader.biSize =sizeof(bi.bmiHeader);
DWORD dwdLenInBytes=0;
const CBitmap* bmp=dc->GetCurrentBitmap();
if(!::GetDIBits(*dc,*bmp,0,0,0,&bi,DIB_RGB_COLORS) && bi.bmiHeader.biBitCount)break;
bi.bmiHeader.biWidth=4;
bi.bmiHeader.biHeight=4;
dwdLenInBytes=
(
(
bi.bmiHeader.biWidth*bi.bmiHeader.biBitCount+31
)
/32
)
*4
*bi.bmiHeader.biHeight;
if(!dwdLenInBytes)break;
DATA.resize(dwdLenInBytes);
if(DATA.size()<dwdLenInBytes)break;
DWORD dwdLines=::GetDIBits(
*dc,*bmp
,0,bi.bmiHeader.biHeight
,&DATA[0]
,&bi
,DIB_RGB_COLORS);
bResult=true;
break;
}
if(dc)m_Dlg->ReleaseDC(dc);
return bResult;
}
далее. Вот скрины из дебажного режима
1 - до чтения битового массива
2 - после
на первом в просмотрщике памяти содержимое переменной bi выделено серым. 8 байтов со значением 0xcc - это дебажный маячок на порчу памяти, он не должен быть затронут.
Но смотрим на скрин 2
0x00ff0000 - нормально, на месте, а вот 8 байтов 0xcc затёрты {00 ff 00 00 ff 00 00 00}
и я не понимаю, почему! Дебаггер то просто ругается, а релиз падает...
Если сделать финт ушами, а именно: объявить массив из двух BITMAPINFO, но работать только с первым, то лишней затирки, естественно, не будет (испортится второй , неиспользуемый, элемент). Но это костыль.
Всё-таки хочется узнать, в чём причина то