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

时间:2018-08-06 05:25:45

标签: winapi

我正在使用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
...

但是,当我尝试将数据缓冲区移动到在堆栈上分配的成员变量时,GetRegionData每次返回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,它是ERROR_ALREADY_EXISTS,似乎没有什么意义。

1 个答案:

答案 0 :(得分:1)

感谢Raymond指出尺寸错误-确实是一个错误,但这不是问题的原因。实际原因是字节对齐。我正在处理的项目的字节对齐方式设置为默认值1。当我使用__declspec(align(4))为缓冲区指定4字节对齐方式时,问题已解决。