问题描述
我要调用一个读卡器里的一个接口方法,原型是: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