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 関数で指定されているかを調べるにはどうすればよいですか?

EDIT私のプロジェクトは、 C#Rubber Rectangle
のコードを使用してXOR描画を行っています。.Net 4 で動作するようにコードを修正する必要があるようです。

4

1 に答える 1

3

CreateSolidBrushを使用しstdcallます。ほとんどすべてのWin32APIがそうします。彼らは決して使用しませんthiscall。関数は次のように宣言されます。

HBRUSH CreateSolidBrush(
  __in  COLORREF crColor
);

ですから、あなたの間違いは単にあなたのバージョンがあまりにも多くのパラメータを持っているということです。見つけたpinvoke.net宣言は正しいです。

規則はstdcallパラメーターを右から左にプッシュします。これは、余分な偽のパラメーターを使用した場合でもコードがどのように機能するかを説明しています。

于 2012-10-08T21:19:57.983 に答える