0

我有一个 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);

当我执行它时,会出现堆栈不平衡的错误。

有人可以帮我找出错误在哪里吗?

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

4

1 回答 1

0

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

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

我要发表的其他评论是:

  • 最好使用它extern "C"来抑制 C++ 名称修改。尽管在评论中,汉斯主张修改。
  • 您已映射size_tuint. 这在 32 位上可以正常工作,但在 64 位上不行,64size_t位宽。我建议你UIntPtr在这里使用。
  • 您确定该函数调用了 SetLastError。它不是 Windows 功能,所以我猜它不是。
于 2013-04-16T09:12:32.727 回答