由于指针导致堆栈不平衡

本文关键字:堆栈 不平衡 指针 于指针 | 更新日期: 2023-09-27 18:32:59

我不知道如何解决这个问题,我已经把头撞在砖墙上两个小时了。我在非托管 DLL 中有一个函数,其中包含以下文档:

BOOL ZLNET_QueryDeviceTime(LONG lLoginID, LPZLNET_TIME pDeviceTime, int waittime=2000);

我假设pDeviceTime是一个指针,因此我在 C# 代码中传递以用作参考。在我的 C# 项目中,我有以下声明:

[StructLayout(LayoutKind.Sequential)]
    public struct ZLNET_TIME
    {
        public Int32 dwYear;
        public Int32 dwMonth;
        public Int32 dwDay;
        public Int32 dwHour;
        public Int32 dwMinute;
        public Int32 dwSecond;
    } ;
[DllImport("zlnetsdk.dll")]
unsafe public static extern bool ZLNET_QueryDeviceTime(long lLoginID, out ZLNET_TIME pDeviceTime, int waittime);

I 调用我的函数:

ZLNET_TIME t = new ZLNET_TIME();
ZLNET_QueryDeviceTime(loginResult, out t, 2000);

但是,当我运行我的项目时,我收到错误:

托管调试助手 PInvokeStackImbalance 在 (我的应用 EXE( 中检测到问题。

其他信息:对函数VP::ZLNET_QueryDeviceTime PInvoke调用使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

然后,我在ZLNET_TIME变量中什么也没得到。谁能帮我解决这个问题?

由于指针导致堆栈不平衡

C# 代码中的第一个参数应该是 int 而不是 long。在C++侧长是 32 位类型。但在 C# 中它是 64 位。

另一个潜在的问题是调用约定。你确定C++代码是标准调用吗?它看起来像是 cdecl,除非您省略了指定调用约定的代码。