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”,其成员类型为BITMAPINFOHEADER的“ bmiHeader”;

复制内存后,我想更改bmiCurrWindow的值。
即我想要bmiCurrWindow.bmiHeader.biWidth = 480;
bmiCurrWindow.bmiHeader.biHeight = 640;

但是,如果我编写上面的代码,则在执行时会给我访问错误。

我该如何解决?

最佳答案

使用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);
}

关于c - Windows中的copymemory()问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1845909/

10-09 20:32