0

我将我的项目从 VS2005(针对 .net 2)更新到 VS2010(针对 .net4)。似乎默认情况下启用了pInvokeStackImbalance MDA,然后我得到了一堆"unbalanced the stack"异常。以这个为例:

[DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateSolidBrush(BrushStyles enBrushStyle, int crColor);  

它在 .net 2 中工作,但现在它抛出异常。我把它改成了这个,它可以工作:

[DllImportAttribute("gdi32.dll", CallingConvention = CallingConvention.ThisCall)]
private static extern IntPtr CreateSolidBrush(BrushStyles enBrushStyle, int crColor);

令我惊讶的是,pinvoke.net将其列为

[DllImport("gdi32.dll")]
static extern IntPtr CreateSolidBrush(uint crColor);

为什么我的老人不工作?似乎 pinvoke.net 是错误的,但我如何找出哪个调用转换是给定一个 win32 函数?

编辑
我的项目正在使用C# Rubber Rectangle中的代码进行 XOR 绘图。显然,代码需要修复才能在 .Net 4 中工作。

4

1 回答 1

3

CreateSolidBrush使用stdcall. 几乎所有 Win32 API 都这样做。他们从不使用thiscall. 该函数声明为:

HBRUSH CreateSolidBrush(
  __in  COLORREF crColor
);

所以你的错误只是你的版本有太多参数。您找到的 pinvoke.net 声明是正确的。

stdcall约定将参数从右向左推,这解释了即使使用额外的虚假参数,您的代码也是如何工作的。

于 2012-10-08T21:19:57.983 回答