【问题标题】:copymemory() problem in windowswindows中的copymemory()问题
【发布时间】:2010-12-23 04:29:04
【问题描述】:
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() 有效吗?
  • m_pCapWndArray 是如何定义的?

标签: c winapi memory copy


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2013-04-02
    • 1970-01-01
    • 2017-12-20
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多