Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2011, 01:24   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию GetDIBits пишет за буфеер => Heap corruption detected.

Неделю назад написал такую функцию:
Код:
void Bmp2Mat(HDC hDC, HBITMAP hBmp, cv::Mat &img8UC3)
{
	int size=3*img8UC3.cols*img8UC3.rows;
	BYTE *bmpData = new BYTE[size];
	
	BITMAPINFOHEADER bmi={0};

    bmi.biSize = sizeof(BITMAPINFOHEADER);
    bmi.biPlanes = 1;
    bmi.biBitCount = 24;
	bmi.biWidth = img8UC3.cols;
	bmi.biHeight = -img8UC3.rows;
    bmi.biCompression = BI_RGB;

	GetDIBits(hDC, hBmp, 0, img8UC3.rows, bmpData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
	
	memcpy(img8UC3.data, bmpData, size);
	delete [] bmpData;
}
Вытаскивал матрицу из HDC... Работала (да и до сих пор работает) без пререканий, но только на одном окне (мне в принципе другие не нужны, но разобраться хочется). Сегодня решил потестить для окна калькулятора...
И что я увидел? Ошибку "Heap corruption detected"... Оказалось, что GetDIBits каким-то образом пишет за пределы массива... Гуглил-гуглил и вот что нашёл: http://www.rsdn.ru/forum/winapi/111983.flat.aspx
Там похожая проблема, но только для 4 бит (сказали, что функа ещё палитру пытается всунуть). Мне добавить в bmi массив размера 2^24????
На msdn вроде написано, что палитру не должно записывать =\
Да и почему для одного окна работает, а для другого сыпется?

UPD: Оказалось, что везде работает, кроме калькулятора (win7). У него с шириной какая-то бага. По факту она 1 пиксель больше чем выдаёт GetWindowRect/GetClientRect

Последний раз редактировалось TwiX; 25.09.2011 в 06:58.
TwiX вне форума Ответить с цитированием
Старый 16.11.2013, 19:24   #2
ZahAlex
Пользователь
 
Регистрация: 08.04.2009
Сообщений: 45
По умолчанию

Попробуй обнулить всё в структуре BITMAPINFO, кроме размера структуры (28h).
После изучения ассемблера стал мозг зависать...
ZahAlex вне форума Ответить с цитированием
Старый 16.11.2013, 22:27   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Размер строки должна быть кратной 32битам.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить пиксель в Hbitmap через GetDIBits. TwiX Win Api 1 19.09.2011 11:07
detected IDE drivers nikox12 Компьютерное железо 1 02.05.2011 19:51
Corruption of the heap при вызове деструктора pure Общие вопросы C/C++ 1 30.11.2010 21:09
Heap Corruption при попытке перевыделить память под массив внутри структуры Farrel Общие вопросы C/C++ 1 21.04.2010 00:45
HEAP CORRUPTION удаляю массив delias Общие вопросы C/C++ 1 10.12.2009 10:17