windows中的copymemory()问题

时间:2009-12-04 09:44:53

标签: c winapi memory copy

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 个答案:

答案 0 :(得分:1)

使用capGetVideoFormat()来调用它两次的正确(和记录)方法 - 一次获得所需内存的大小,然后分配该大小的内存,然后再次调用它来填充内存。这是因为BITMAPINFO :: bmiColors成员是可变长度的,因此您必须确保有足够的内存来接收所有这些数据。您的代码当前编写的方式是,您在堆栈上分配BITMAPINFO,但实际的BITMAPINFO声明仅指定其bmiColors成员中1 RGBQUAD项的空间。如果您的视频格式中包含多种颜色,则表示您正在损坏堆栈内存。您需要在堆上动态分配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);
}