代码之家  ›  专栏  ›  技术社区  ›  bennji_of_the_overflow

GetRegionData()不适用于堆栈分配的缓冲区

  •  0
  • bennji_of_the_overflow  · 技术社区  · 6 年前

    我正在使用win32函数 GetRegionData(...) 根据WM_paint消息提取组成无效绘制区域的精确矩形。

    以下代码工作正常,第二次调用 GetRegionData 成功。

    DWORD uRegionSize = GetRegionData(hRgn, sizeof(RGNDATA), NULL);  // Send NULL request to get the storage size
    RGNDATA* pData = (RGNDATA*)(new char[uRegionSize]);   // Allocate space for the region data
    pData->rdh.dwSize = uRegionSize;
    DWORD uSizeCheck = GetRegionData(hRgn, uRegionSize, pData);
    if (uSizeCheck != uRegionSize) {
         // FAIL!
         delete[] pData;
         return;
    }
    ...
    do stuff with rectangles
    ...
    

    但当我试图将数据缓冲区移动到堆栈上分配的成员变量时, 获取区域数据 每次返回0时失败。

    在我的标题中:

    char UpdateRegionData[LOTS_MORE_BYTES_THAN_NEEDED];
    

    在我的cpp中:

    DWORD uRegionSize = GetRegionData(hRgn, sizeof(RGNDATA), NULL);  // Send NULL request to get the storage size
    RGNDATA* pData2 = (RGNDATA*)UpdateRegionData;
    pData2->rdh.dwSize = uRegionSize;
    DWORD uSizeCheck = GetRegionData(hRgn, uRegionSize, pData2);
    
    if (uSizeCheck != uRegionSize) {
         // FAIL!
         return;
    }
    

    两个版本之间唯一不同的是内存分配,但是第二个版本失败了。 GetLastError() 返回代码183,这是一个已经存在的错误,似乎没有什么意义。

    1 回复  |  直到 6 年前
        1
  •  1
  •   bennji_of_the_overflow    6 年前

    感谢雷蒙德指出的大小错误-这确实是一个错误,但这不是问题的原因。实际原因是字节对齐。我正在处理的项目的字节对齐设置为默认值1。当我使用 __declspec(align(4)) 然后问题就解决了。