Winapi GetRegionData()不适用于堆栈分配的缓冲区
我正在使用win32函数Winapi GetRegionData()不适用于堆栈分配的缓冲区,winapi,Winapi,我正在使用win32函数GetRegionData(…)提取组成无效绘制区域的精确矩形,以响应WM_绘制消息 以下代码工作正常,对GetRegionData的第二次调用成功 DWORD uRegionSize = GetRegionData(hRgn, sizeof(RGNDATA), NULL); // Send NULL request to get the storage size RGNDATA* pData = (RGNDATA*)(new char[uRegionSize]);
GetRegionData(…)
提取组成无效绘制区域的精确矩形,以响应WM_绘制消息
以下代码工作正常,对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,该错误已经存在,似乎没有多大意义。感谢Raymond指出大小错误-这确实是一个错误,但不是问题的原因。实际原因是字节对齐。我正在处理的项目将其字节对齐设置为默认值1。当我使用\u declspec(align(4))
为缓冲区指定4字节对齐方式时,问题就解决了。与大多数GDI函数一样,GetRegionData()
不使用GetLastError()
报告错误。GDI没有公开一种方法来知道它的函数为什么会失败。您看到的183错误来自早期的API调用。因为API无法知道缓冲区位于哪个内存(堆栈、堆或其他)中。绝对不管缓冲区位于何处,如果大小正确dwSize
记录为“标题的大小(以字节为单位)”,而不是缓冲区的大小。(还有:对齐。)谁否决了这个问题,谁会介意解释为什么?对于分配堆栈内缓冲区-特殊存在-和分配的缓冲区已经16字节对齐