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 个参数应该是 UIntPtr 而不是 ulong。 这就是我现在的感觉

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 个参数应该是 uint,而不是 ulong。

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.mapviewofile

于 2012-05-22T20:40:53.657 回答