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

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]);

我正在使用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]);   // 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字节对齐