由于指针的不平衡堆栈

时间:2013-09-27 12:22:16

标签: c# c++ pointers pinvoke

我不知道如何解决这个问题,而且在两小时的最佳时间里,我一直在撞墙。我在非托管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);

我称之为我的职能:

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

然而,当我运行我的项目时,我收到错误:

  

托管调试助手PInvokeStackImbalance在(MY APP EXE)中检测到问题。

     

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

然后我在ZLNET_TIME变量中得不到任何回复。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

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

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