【发布时间】:2011-02-14 23:25:57
【问题描述】:
我正在 P/调用 gdi32.dll 中的 CreateRectRgn。此函数的正常 P/Invoke 签名是:
[DllImport("gdi32", SetLastError=true)]
static extern IntPtr CreateRectRgn(int nLeft, int nTop, int nRight, int nBottom);
作为捷径,我还定义了这个重载:
[DllImport("gdi32", SetLastError=true)]
static extern IntPtr CreateRectRgn(RECT rc);
[StructLayout(LayoutKind.Sequential)]
struct RECT{
public int left;
public int top;
public int right;
public int bottom;
}
(是的,我知道CreateRectRgnIndirect,但是由于我必须使用函数在System.Drawing.Rectangle 和这个RECT 结构之间进行转换,所以上面对我更有用,因为它不涉及中间变量.)
这个重载应该和普通签名一样工作,因为它应该在CreateRectRgn的入口处将堆栈置于相同的状态。事实上,在 32 位的 Windows XP 上,它可以完美运行。但在 Windows 7 64 位上,函数返回 0,Marshal.GetLastWin32Error() 返回 87,即“参数不正确”。
关于可能是什么问题的任何想法?
【问题讨论】: