P / Invoke in C#,如何找出CallingConvention?

时间:2012-10-08 21:17:29

标签: c# winapi pinvoke

我将我的项目从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中工作。

1 个答案:

答案 0 :(得分:3)

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

HBRUSH CreateSolidBrush(
  __in  COLORREF crColor
);

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

stdcall约定从右到左推送params,这解释了即使使用额外的虚假参数,代码也能如何工作。