2009-12-04 6 views
0
struct tagBITMAPINFO { 
    BITMAPINFOHEADER bmiHeader; 
    RGBQUAD    bmiColors[1]; 
} BITMAPINFO; 

tagBITMAPINFOHEADER{ 
     DWORD  biSize; 
     LONG  biWidth; 
     LONG  biHeight; 

} BITMAPINFOHEADER 


BITMAPINFO bmiCurrWindow; 

capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, &bmiCurrWindow, formatsize); 


CopyMemory(&(*m_pCapWndArray)[i].bmiHeader, &(bmiCurrWindow.bmiHeader), sizeof(BITMAPINFOHEADER)); 

bmiCurrWindow представляет собой структуру 'BITMAPINFO', который имеет элемент 'bmiHeader' типа BITMAPINFOHEADER;CopyMemory() проблема в окнах

после копирования памяти я хочу изменить значение bmiCurrWindow. i.e я хочу bmiCurrWindow.bmiHeader.biWidth = 480; bmiCurrWindow.bmiHeader.biHeight = 640;

Но если я напишу вышеприведенный код, то во время его выполнения я получаю сообщение об ошибке voilation.

Как его переустановить?

+0

Вы уверены, что capGetVideoFormat() работал? – Guillaume

+0

Как определяется m_pCapWndArray? –

ответ

1

Правильный (и документированный) способ использования capGetVideoFormat() для вызова его дважды - один раз, чтобы получить требуемый размер памяти, затем выделить память такого размера, а затем вызвать его второй раз для заполнения памяти , Это связано с тем, что элемент BITMAPINFO :: bmiColors имеет переменную длину, поэтому вы должны убедиться, что у вас достаточно памяти для получения всех этих данных. Так как ваш код в настоящее время написан, вы выделяете BITMAPINFO в стеке, но фактическая декларация BITMAPINFO указывает только место для 1 элемента RGBQUAD в элементе bmiColors. Если в вашем видеоформате содержится более одного цвета, вы повреждаете стек памяти. Вам нужно динамически выделять BITMAPINFO на кучу, например:

DWORD dwSize = capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, NULL, 0); 
if (dwSize > 0) 
{ 
    BITMAPINFO *bmpInfo = (BITMAPINFO*) malloc(dwSize); 
    if (bmpInfo != NULL) 
    { 
    capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, bmpInfo, dwSize); 
    (*m_pCapWndArray)[i].bmiHeader = bmpInfo->bmiHeader; 
    } 
    free(bmpInfo); 
} 
Смежные вопросы