求助!!调用读卡器接口,传递的参数类型是否有误,返回结果都是失败!!!

问题描述

我要调用一个读卡器里的一个接口方法,原型是:EXPORTAPIint_stdcallRdrReadCardByNetwork(char*port,char*inmachineid,char*outresult);

方法说明:参数名传输方向参数类型参数意义取值说明portINchar*串口名形如:”COM1”或”com1”inmachineidINChar*读卡器IDoutresultOUTChar*输出的数据他们那边提供的demo是这样的写的RdrReadCardByNetwork((char*)portname.c_str(),(char*)eachmachineid.c_str(),outcardid.GetBuffer(4097));

我现在用C#调用是这样写的[DllImport("RdrReader485A.dll",EntryPoint="RdrReadCardByNetwork")]publicstaticexternintRdrReadCardByNetwork(stringport,stringinmachineid,StringBuilderoutresult);StringBuilderoutresult=newStringBuilder(1024);stringinmachineid="121506110425";stringport="COM5";intstatus=common.RdrReadCardByNetwork(port,inmachineid,outresult);//这里status返回一直是-1返回1才是成功的。

现在不知道是不是我传的参数类型不对还是怎么样还请各位大大帮我看看是什么情况谢谢啦

解决方案

解决方案二:
你先运行demo看到底返回的是什么,是否你com口指定的不对demo运行成功了,再纠结你的代码否则都是白纠结
解决方案三:
引用1楼Z65443344的回复:

你先运行demo看到底返回的是什么,是否你com口指定的不对demo运行成功了,再纠结你的代码否则都是白纠结

demo返回的是成功的返回值是1,我本机串口号是com5,我用demo传com5是可以运行的
解决方案四:
outresultOUTChar*输出的数据既然是输出的数据,你应该加out关键字啊或者把string换成stringbuilder试试
解决方案五:
引用3楼Z65443344的回复:

outresultOUTChar*输出的数据既然是输出的数据,你应该加out关键字啊或者把string换成stringbuilder试试

因为之前还有另外一个方法,也是有一个参数是out类型的调用方法时是不用加out关键字,那个方法能返回数据。但是这个方法就不行,out关键字我也加过了,是不行的。
解决方案六:
另外一个方法的参数也是char*吗
解决方案七:
看看demo里的outcardid.GetBuffer(4097)这个函数怎么定义的
解决方案八:
引用5楼Z65443344的回复:

另外一个方法的参数也是char*吗

是的也是char*我C#调用也是传的stringbuilder不用加out关键字引用6楼Z65443344的回复:

看看demo里的outcardid.GetBuffer(4097)这个函数怎么定义的

CStringAoutcardid;intretval=RdrReadCardByNetwork((char*)portname.c_str(),(char*)eachmachineid.c_str(),outcardid.GetBuffer(4097));outcardid.ReleaseBuffer();

解决方案九:
stringbuilder不需要加out关键字,因为它是引用类型,类似数组而string类型在C#里是按值类型处理的
解决方案十:
引用8楼Z65443344的回复:

stringbuilder不需要加out关键字,因为它是引用类型,类似数组而string类型在C#里是按值类型处理的

RdrReadCardByNetwork(char*port,char*inmachineid,char*outresult)前两个参数是传入的用string应该是没有问题的最后一个参数我传的就是stringbuilder呀你的意思是我前两个参数也用stringbuilder传入吗?这个方式我也试过了结果不行
解决方案十一:
StringBuilderoutresult=newStringBuilder(1024);这里不要指定长度或者改成StringBuilderoutresult=newStringBuilder(4097);试试?因为demo里的函数明显的传入了个4097,到底干啥用的
解决方案十二:
引用10楼Z65443344的回复:

StringBuilderoutresult=newStringBuilder(1024);这里不要指定长度或者改成StringBuilderoutresult=newStringBuilder(4097);试试?因为demo里的函数明显的传入了个4097,到底干啥用的

不指定长度我试过了,指定4097也试过了,都是不行的它demo应该是用MFC写的,恰恰就是我对这块不太懂,网上查了下CStringGetbuffer的作用说是将字符串的缓冲区长度锁定那应该就是C#里把stringbuilder预设初始大小缓冲区吧不知道为什么就是不行真的蛋疼
解决方案十三:
不行用char[4097]试试先如果可以,再想办法把char数组转字符串
解决方案十四:
引用12楼Z65443344的回复:

不行用char[4097]试试先如果可以,再想办法把char数组转字符串

char[]byte[]都试过了
解决方案十五:
设置charset
解决方案:
引用14楼Saleayas的回复:

设置charset

这个都是默认的
解决方案:
char*和string不一定是匹配的,可能就是这个问题,试试加入CharSet=CharSet.Ansi
解决方案:
你什么读卡器啊,官方应该有演示代码啊,先试试demo吧
解决方案:
引用楼主z289830131的回复:

我要调用一个读卡器里的一个接口方法,原型是:EXPORTAPIint_stdcallRdrReadCardByNetwork(char*port,char*inmachineid,char*outresult);

方法说明:参数名传输方向参数类型参数意义取值说明portINchar*串口名形如:”COM1”或”com1”inmachineidINChar*读卡器IDoutresultOUTChar*输出的数据他们那边提供的demo是这样的写的RdrReadCardByNetwork((char*)portname.c_str(),(char*)eachmachineid.c_str(),outcardid.GetBuffer(4097));

我现在用C#调用是这样写的[DllImport("RdrReader485A.dll",EntryPoint="RdrReadCardByNetwork")]publicstaticexternintRdrReadCardByNetwork(stringport,stringinmachineid,StringBuilderoutresult);StringBuilderoutresult=newStringBuilder(1024);stringinmachineid="121506110425";stringport="COM5";intstatus=common.RdrReadCardByNetwork(port,inmachineid,outresult);//这里status返回一直是-1返回1才是成功的。

现在不知道是不是我传的参数类型不对还是怎么样还请各位大大帮我看看是什么情况谢谢啦

有可能给返回分配的buffer长度不够demo不是要求分配4097吗?c#中默认字符是Unicode,这个c/c++dll看约定应该是ansi所以DllImport时需要加上CharSet=CharSet.Ansi

时间: 2024-11-16 12:35:14

求助!!调用读卡器接口,传递的参数类型是否有误,返回结果都是失败!!!的相关文章

Java Axis2 的 RPC 方式调用 webservice 接口 传递对象参数 服务器端接收参数值为NULL

问题描述 JavaAxis2的RPC方式调用webservice接口传递对象参数(其他形式的参数没有试过)时,服务器端可接收到访问,但参数值为null.请问大家有没有遇到过这样的问题,又是怎么解决的??? 解决方案 解决方案二:对方的webservice是document风格的吗?

请问这里面有没有人用过AVAYA公司开发的CCE套件的axphone控件来做过软电话的,我在做转接电话功能的时候,调用的接口总是报参数出错,有的话请留下msn,多多感谢

问题描述 请问这里面有没有人用过AVAYA公司开发的CCE套件的axphone控件来做过软电话的,我在做转接电话功能的时候,调用的接口总是报参数出错,有的话请留下msn,多多感谢 解决方案 解决方案二:nuclearking@sohu.com,这个是邮件不是MSN,咱们邮件交流吧解决方案三:不明LZ在说什么解决方案四:接分是王道!

java调用存储过程的传递Date参数的问题

建了一个存储过程 create procedure PR_YDFT_GETFT_TIME @AJLB tinyint, -- 案件类别 @AJBHLIST varchar(1500), -- 案件编号列表 @KSSJ datetime, -- 开始时间 @JSSJ datetime -- 结束时间 as begin ---- select BH, AH from K_ZS..B_ZX where(这里返回一个结果集) end 在java代码中如下调用(时间类型为java.sql.Date),即使

调用对方接口;出现连接的主机没有反应,连接尝试失败错误 求解,谢谢

问题描述 以下是代码:protectedvoidPage_Load(objectsender,EventArgse){stringstr=orderApi.getinfoText("3986011529712");stringstrpj="http://www2.baoshuidian.com:800/LineToOnline.jsp?OAMessage="+str+"&check=e03a0f6be015bb4860ab067acd6a0897&

C#的参数类型:params、out和ref

  首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 方法名([参数类型] 数据类型 参数名) {方法体} 这篇文章主要是为了讲解 参数表里面的可选项[参数类型],这个参数类型的设置会影响到我们对参数施加操作后的结果或影响我们对方法的调用方式. C#之中参数类型分为4种: 无:默认的,普通参数 params:不定长参数 out:输出变量 ref:引用传递 普通参数,当参数是值类型时传值,当参数为引用类型时传址,这个由于各类C#的书都一定会讲,此处略过. para

android调用webservice接口获取信息

我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包并导入 2.在xml 配置文件中加入: <!-- 访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET" /> 3.接下来就要通过代码调用借口了 String WSDL_URI

Android用ksoap2调用Webservice怎么传递List集合参数?

问题描述 Android用ksoap2调用Webservice怎么传递List集合参数? 最近用到ksoap2调用Webservice获取数据,需要传递一些参数过去,除了基本类型的参数,还有List集合参数,各种试都报错,求教怎么传递List集合参数? 解决方案 可以尝试将集合转换为 JSON 或 XML 格式传输,跨语言都这样做. 解决方案二: 参考下我这篇博客:http://blog.csdn.net/chinacsharper/article/details/38386779

sap-java调用SAP的RFC如何传递数组参数

问题描述 java调用SAP的RFC如何传递数组参数 SAP是服务端,使用JCO3的jia包,RFC服务端的函数有一个数组类型的参数. java代码这边用什么形式给它传值.新手请赐教 解决方案 Java中连接SAP进行RFC调用JAVA本地方法调用(2)数组参数传递java调用SAP RFC函数

java 参数类型传递问题

问题描述 java 参数类型传递问题 public pojo getObject(pojo){ 处理过程 pojo.getXxx(); 处理过程 return pojo } 传递的对象我不知道是什么类型的,只知道都有一个Xxx属性, 这个要怎么才能处理呢?传递什么参数我都可以控制,pojo上层没有接口 解决方案 参数类型设置成Object 解决方案二: 用beanutil的getPropert方法 解决方案三: 这种情况下用泛型要好点 解决方案四: 可以用泛型 如 public static <