2

プロジェクトを .NET 3.5SP1 から .NET 4.5 にアップグレードしたところ、comctl32 から DllGetVersion への呼び出しで PInvokeStackImbalance MDA を取得しています。フレームワークがデフォルトで誤った呼び出し規則に対して回復力がなくなっていることを読み、理解しました。奇妙なのは、私が正しいと信じている CallingConvention.Cdecl を既に指定していることです。CallingConvention 属性を完全に削除してデフォルト (CallingConvention.WinAPI) にすると、PInvokeStackImbalance が取得されません。誰でもこれに光を当てることができますか?OSはWin 7 64ビットで、違いがあれば32ビットアプリです。DllGetVersion 関数のヘッダー ファイルを調べてみましたが、呼び出し規約がどうあるべきかわかりません。

    [DllImport("Comctl32.dll", EntryPoint = "DllGetVersion", CallingConvention = CallingConvention.Cdecl)]
    private static extern int NativeDllGetVersion(ref DLLVERSIONINFO pdvi);
4

1 に答える 1

2

一般に、すべての Windows API 呼び出しで を使用する必要がありますCallingConvention.StdCall

この場合、 の宣言を見ると、次DllGetVersionのように定義されていることがわかります。

HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);

CALLBACKは次のように定義されます。

#define CALLBACK __stdcall

メモ付き:

CALLBACK、WINAPI、および APIENTRY はすべて、__stdcall 呼び出し規約で関数を定義するために使用されます。Windows API のほとんどの関数は、WINAPI を使用して宣言されています。関数をコールバック関数として識別しやすくするために、実装するコールバック関数に CALLBACK を使用することをお勧めします。

あなたの場合、これはに切り替えるStdCall必要があることを意味します。

于 2013-03-06T16:40:17.633 に答える