我有一个 C++ dll,用于卡片打印(身份证)。我的实现是使用 C#.Net 完成的。我使用以下代码来调用 c++ dll。
[DllImport(@"J230i.dll",CallingConvention = CallingConvention.Cdecl,SetLastError=true)]
public static extern int N_PrintJobStatus(ref int[] nPrtintjobStatus);
int[] pJob = {0,0,0,0,0,0,0,0} ;
ret = N_PrintJobStatus( ref pJob);
N_PrintJobStatus 方法签名如下
N_PrintJobStatus(int *pJobStatus )
调用该方法后出现以下错误
对 PInvoke 函数“********!*********.frmCardPrint::N_PrintJobStatus”的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我该如何解决这个问题
谢谢 .....
你的翻译不正确。一个 int 数组,int*
不映射到ref int[]
。后者将被整理为int**
。你需要改为使用int[]
.
[DllImport(@"J230i.dll", CallingConvention = CallingConvention.Cdecl,
SetLastError = true)]
public static extern int N_PrintJobStatus(int[] nPrtintjobStatus);
在调用函数之前分配数组。想必您有某种方法来确定它应该有多长。就目前情况而言,该函数看起来像是等待发生缓冲区溢出。函数如何知道数组有多长,从而采取措施避免写入超出其末尾?
目前尚不清楚这是唯一的问题。我们不能确定返回类型确实是int
。或者调用约定是 cdecl。或者该函数确实调用了SetLastError
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)