проблема copymemory () в windows - PullRequest
       16

проблема copymemory () в windows

0 голосов
/ 04 декабря 2009
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;

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

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

Как мне восстановить его?

1 Ответ

1 голос
/ 05 декабря 2009

Правильный (и задокументированный) способ использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...