Правильный (и задокументированный) способ использовать 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);
}