日期:2014-05-18  浏览次数:20793 次

急求解决,关于C#调用动态库问题!!
动态库中函数如下:
2.脱机读取卡号
函数声明 int ykt_readopencardno_local (char *pRegion, char *pDeptid,char *pDeptKey, char * pCardtype,char * pCardno, char *pWarnmsg,char *pErrmsg)

返回0,成功,-1失败

这个应该是C++动态库吧?我需要从该函数中得到如下信息:
pRegion Char(4) 地区编号
pDeptID Char(4) 网点编号
pDeptKey Char(512) 网点密钥
pCardtype Char(2) 卡类型
pCardno Char(20) 卡号
pWarnmsg Char(1024) 警告信息
pErrmsg Char(1024) 错误信息

我用C#调用该动态库函数,函数调用声明如下:
[DllImport("fzyktclient.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int ykt_readopencardno_local([Out]StringBuilder pRegion, [Out]StringBuilder pDeptid, [Out]StringBuilder pDeptKey, [Out]StringBuilder pCardtype, [Out]StringBuilder pCardno, [Out]StringBuilder pWarnmsg, [Out]StringBuilder pErrmsg);

具体的C#调用类型我不太清楚,不知道该怎么写?我试过string、[Out]IntPtr、 [Out]IntPtr[] 等等一些,程序都执行成功了,但函数返回值都为-1,失败了,是我类型声明有问题,还是怎么的?我到底该用哪种类型调用啊?如何才能得到我要的信息?求朋友解答一下,小弟感激不尽!!


------解决方案--------------------
char*用byte[]试一下
------解决方案--------------------
StringBuilder 前面不需要加[Out]属性

另外调用时你的StringBuilder 类型要进行初始化.根据你前面提到的长度将所有的StringBuilder 都初始为相应的长度,再调用ykt_readopencardno_local

StringBuilder pRegion =new StringBuilder(4);
...