Windows 中的 copymemory() 问题

标签 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”,它具有 BITMAPINFOHEADER 类型的成员“bmiHeader”;

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

但是如果我编写上面的代码,在执行时会出现访问破坏错误。

如何解决?

最佳答案

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

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

相关文章:

c - C 编程中的递归

c++ - 如何检查已安装的字体样式?

unit-testing - GDI中控制图的单元测试

c++ - 初始化程序无法确定字符数组的大小

C++:作为指针的全局变量

c - 当我向它添加 0.1 时, float 不会改变

c - 在字符串中搜索子字符串时出现段错误

c - 如何通过在C中传递 "Console Windows"来将像素设置为 "String Pointer"?

python - 指定日期时间周数格式

复制到 C 中的 Null 位置并传递无效数据时崩溃