2

PInvokeStackImbalanceを取得しています:'PInvokeStackImbalanceが検出されましたメッセージ:PInvoke関数' ConvertedClass::MapViewOfFile'の呼び出しでスタックのバランスが崩れました。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。

私はDLLの使用にかなり慣れておらず、今日はいくつかのチュートリアルを実行することができました。

どんな助けでもいただければ幸いです。

using System.Runtime.InteropServices;     

//dll
[DllImport("kernel32", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]

public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, FileMapAccessRights dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, ulong dwNumberOfBytesToMap;)

string szSharedMemory = "FUNKY_BUSINESS";

//other dll call is successful and returns value
IntPtr hMem = OpenFileMapping(FileMapAccessRights.Write, FALSE, szSharedMemory);

///BOOM.. not this one
IntPtr pvHead = MapViewOfFile(hMem, FileMapAccessRights.Write, 0, 0, 0);

編集:それは悪い議論でした。5番目の引数はulongではなくUIntPtrである必要があります。 これが今の私の気持ちです

4

2 に答える 2

2

最後のパラメータはSIZE_Tです。これは符号なしであり、32ビットプロセスでは32ビット、64ビットプロセスでは64ビットです。したがって、最善の解決策はUIntPtr、最終的なパラメーターに使用することです。

私は以下を使用します:

[DllImport("kernel32")]
public static extern IntPtr MapViewOfFile(
    IntPtr hFileMappingObject,
    FileMapAccessRights dwDesiredAccess, 
    uint dwFileOffsetHigh, 
    uint dwFileOffsetLow, 
    UIntPtr dwNumberOfBytesToMap
);

コードulongは常に64ビット幅を使用します。また、プロセスは32ビットプロセスであり、P/invokeマーシャラーがスタックの不均衡を検出した理由を説明しています。

于 2012-05-22T20:40:17.287 に答える
0

5番目のパラメーターは、ulongではなくuintである必要があります。

public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, FileMapAccessRights dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumberOfBytesToMap;)

P / Invokeの場合、pinvoke.netのサンプルコードを使用できます。 http://www.pinvoke.net/default.aspx/kernel32.mapviewoffile

于 2012-05-22T20:40:53.657 に答える