PInvoke使堆栈失衡

时间:2013-04-16 06:35:09

标签: stack pinvoke

我有一个c ++函数要导出为.dll使用:

static __declspec(dllexport) void DiagEncrypt(
    UCHAR              * ptrDataByte, 
    size_t               numBytes, 
    ACCESS_LEVEL         accLevel);
void DiagnosticCrypto::DiagEncrypt(UCHAR * ptrDataByte, size_t numBytes, ACCESS_LEVEL accLevel)

我在C#程序中导入它:

[DllImport("DiagnosticCryptoDll.dll", EntryPoint = "?DiagEncrypt@DiagnosticCrypto@DiagnosticCryptoDll@@SAXPAEIW4ACCESS_LEVEL@12@@Z", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern void DiagEncrypt(
    //[MarshalAs(UnmanagedType.LPArray)] byte[] data,
    IntPtr  data,
    uint    numBytes, //UintPtr numBytes,
    ACCESS_LEVEL accLevel);

当我执行它时,存在堆栈不平衡的错误。

有人可以帮我找出错误的位置吗?

标记的部分是我尝试但失败了。

1 个答案:

答案 0 :(得分:0)

您的C ++代码使用cdecl调用约定,但您的p / invoke使用stdcall。改变或匹配其他。

例如,您可以更改p / invoke以使用CallingConvention.Cdecl

我要做的其他评论是:

  • 最好使用extern "C"来抑制C ++名称修改。虽然在评论中,汉斯争辩说要破坏。
  • 您已将size_t映射到uint。这将在32位上正常工作,但在64位上不起作用,其中size_t为64位宽。我建议你在这里使用UIntPtr
  • 您是否确定该函数调用了SetLastError。它不是Windows功能所以我猜它不会。