1

私はCreateRectRgngdi32.dllでP/Invokingしています。この関数の通常の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.RectangleRECT

このオーバーロードは、へのエントリ時にスタックを同じ状態にする必要があるため、通常の署名と同じように機能するはずですCreateRectRgn。実際、32ビットのWindows XPでは、問題なく動作します。しかし、Windows 7、64ビットでは、関数はゼロをMarshal.GetLastWin32Error()返し、87を返します。これは「パラメーターが正しくありません」です。

何が問題になる可能性があるかについてのアイデアはありますか?

4

1 に答える 1

1

おー。Microsoftがx64で使用する呼び出し規約は、STDCALLとはまったく異なります。の呼び出しでCreateRectRgnは、スタックはパラメーターにまったく使用されず、すべてレジスターに渡されます。構造体を渡そうとするとRECT、スタックに構造体のコピーが作成され、このコピーへのポインターがレジスターに入れられます。したがって、この小さなトリックは64ビットWindowsではまったく機能しません。今、私はすべての相互運用コードを調べて、これを行った他の場所を見つけて、それらをすべて取り除く必要があります。

于 2011-02-15T05:14:45.160 に答える