菜鸟请教调用DLL并获取返参

kisssun328 2020-08-07 05:48:09
函数语法
long iReadCardBas(int iType, char pOutInfo)

序号 参数 输入/输出 类型 长度(十进制) 含义 可否为空
1 iType IN 整数 4 操作卡类型 N
2 pOutInfo OUT 字符串 1024 读出数据或返回错误信息 N
返回值 0表示成功;非0表示失败。

以下代码能成功调用DLL并返回iType的值,但是如何获取到pOutInfo这个返回值???

代码如下:
[DllImport("SSCardDriver.dll")]
public static extern int iReadCardBas(int iType, string pOutInfo);

private void button1_Click(object sender, EventArgs e)
{
string y="";
int x = iReadCardBas(1,y);
MessageBox.Show(y.ToString());
}
...全文
2574 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SayoKun 2020-08-08
  • 打赏
  • 举报
回复
引用 5 楼 kisssun328 的回复:
曾经在CSDN混过很长一段时间积攒了不少分,多年过去账号密码都不记得了,如今为了一个问题重新开户。 感谢几位老师的回复,用2楼的方法一次成功,3楼的方法试了几次都不行,我也不知道问题出在哪,但至少问题解决了也学到了知识。如同四楼说的那样,调用DLL最重要的就是数据类型的转换。 //另外这个函数语法虽然定义为long,实际必须用int才能准确获取返回值,如果定义为long会得到一大串数字 //以下代码成功获取返回值 [DllImport("SSCardDriver.dll")] public static extern int iReadCardBas(int iType,StringBuilder pOutInfo); private void button1_Click(object sender, EventArgs e) { //char[] y=new char[1024]; StringBuilder y=new StringBuilder(1024); int x = iReadCardBas(1,y); MessageBox.Show(y.ToString()); }
我对DLL调用并不是很熟悉,单看上面你给出的代码我以为是返回的类型和你定义的类型不匹配……但是我给的代码中定义的类型不正确,所以就应该是2楼说的那个是对的。我这个是错的,
kisssun328 2020-08-08
  • 打赏
  • 举报
回复
曾经在CSDN混过很长一段时间积攒了不少分,多年过去账号密码都不记得了,如今为了一个问题重新开户。 感谢几位老师的回复,用2楼的方法一次成功,3楼的方法试了几次都不行,我也不知道问题出在哪,但至少问题解决了也学到了知识。如同四楼说的那样,调用DLL最重要的就是数据类型的转换。 //另外这个函数语法虽然定义为long,实际必须用int才能准确获取返回值,如果定义为long会得到一大串数字 //以下代码成功获取返回值 [DllImport("SSCardDriver.dll")] public static extern int iReadCardBas(int iType,StringBuilder pOutInfo); private void button1_Click(object sender, EventArgs e) { //char[] y=new char[1024]; StringBuilder y=new StringBuilder(1024); int x = iReadCardBas(1,y); MessageBox.Show(y.ToString()); }
ziqi0716 2020-08-08
  • 打赏
  • 举报
回复
C#调C/C++的dll时候最重要的就是数据类型的转换,如二楼所说的那样,可以看下这个: https://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html
SayoKun 2020-08-07
  • 打赏
  • 举报
回复

[DllImport("SSCardDriver.dll")]
public static extern long iReadCardBas(int iType, string pOutInfo);
private void button1_Click(object sender, EventArgs e)
{
char[] y=new char[1024];
long x = iReadCardBas(1,y);
if(x==0)
{
MessageBox.Show(new string(y));
}
MessageBox.Show("Error Msg:"+new string(y));
}
这样应该没问题……注意long无法隐式转换为int,你这里的x应该是接收不到返回值或者会报错才对。y同样不是string,是需要先用char[]接收,然后转换成string。
wanghui0380 2020-08-07
  • 打赏
  • 举报
回复
手机回复,不方便敲代码。只写说明哈 声明里string---->stringbuilder 使用的时候按他的描述应该初始化1024,也就是 stringbuilder sb=new stringbuilder (1024) 把这个sb传给他 然后 sb.tostring 拿到结果
threenewbee 2020-08-07
  • 打赏
  • 举报
回复
public static extern int iReadCardBas(int iType, ref string pOutInfo);

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧