急求解答!C#调用C++动态库的结构体参数及返回问题 50分

问题描述

最近研究读取一卡通卡号的问题,对方给了动态库DLL及函数帮助文档,计划用C#实现对cpp动态库的调用,由于cpp方面知识实在薄弱,在碰到了结构体传参的时候,一直无法正常进行。Cpp的函数说明:IntLKE_ICCR_HID_ExchangeAPDU(G_APDU_COMM*ApduComm,G_APDU_RESP*ApduResp)

参数定义:ApduComm:APDU数据包APDU应答包返回值:0:成功<0:错误ApduComm结构体-cpptypedefstruct{unsignedBYTECommand[4];unsignedBYTELc;unsignedBYTEDataIn[256];unsignedBYTELe;}G_APDU_COMM;

ApduResp结构体-cpptypedefstruct{unsignedintLengthOut;unsignedBYTEDataOut[512];unsignedBYTESW1;unsignedBYTESW2;}G_APDU_RESP;

我的C#代码:///<summary>///APDU数据包///</summary>[StructLayout(LayoutKind.Sequential)]publicstructG_APDU_COMM{[MarshalAs(UnmanagedType.ByValArray,SizeConst=4)]publicbyte[]command;publicbyteLc;[MarshalAs(UnmanagedType.ByValArray,SizeConst=256)]publicbyte[]DataIn;publicbyteLe;}///<summary>///APDU应答包struct///</summary>[StructLayout(LayoutKind.Sequential)]publicstructG_APDU_RESP{publicuintLengthOut;[MarshalAs(UnmanagedType.ByValArray,SizeConst=512)]publicByte[]DataOut;publicbyteSW1;publicbyteSW2;}

[DllImport("LKEDriver2013.dll",EntryPoint="LKE_ICCR_HID_ExchangeAPDU",SetLastError=true,CharSet=CharSet.Auto,ExactSpelling=false,CallingConvention=CallingConvention.StdCall)]//说明:APDU交换publicstaticexternInt16LKE_ICCR_HID_ExchangeAPDU(refG_APDU_COMMapdu_comm,refG_APDU_RESPapdu_resp);

调用CodeG_APDU_COMMapducomm=newG_APDU_COMM();apducomm.command=newbyte[]{0x00,0xA4,0x04,0x00};apducomm.DataIn=newbyte[]{0x32,0x50,0x41,0x59,0x2E,0x53,0x59,0x53,0x2E,0x44,0x44,0x46,0x30,0x31};G_APDU_RESPapduresp=newG_APDU_RESP();Int16strapdu=LKE_ICCR_HID_ExchangeAPDU(refapducomm,refapduresp);

G_APDU_RESP一直得不到正常的返回,请高手指导下C#下的结构体定义及传参方是否有问题

解决方案

本帖最后由 jswshar 于 2015-06-23 11:07:32 编辑
解决方案二:
C++的签名也不是__stdcall。
解决方案三:
StdCall是调用费托管函数的默认约定,这个定义应该没错吧
解决方案四:
你返回int啊,Int16是什么鬼?
解决方案五:
C++的默认CV是__cdecl.同时command之类的不要new出来,结构体内已经存在了。直接复制到结构体内。

时间: 2024-10-03 00:16:40

急求解答!C#调用C++动态库的结构体参数及返回问题 50分的相关文章

&amp;amp;lt;急&amp;amp;gt;关于jni调用第三方动态库不成功

问题描述 <急>关于jni调用第三方动态库不成功 我在自己的方法中调用第三方动态库的方法可是要么就报该方法没有定义要么就出现如下错误求解答在线等..!!!

通过JNI接口调用c++接口时,c++接口中oracle数据库连接总是创建失败,急求解答

问题描述 通过JNI接口调用c++接口时,c++接口中oracle数据库连接总是创建失败,急求解答 封装了一个c++的接口类给java调用,接口中实现一些数据库查询操作, 接口在mfc下测试正常,通过java调用时数据库创建失败,ado,odbc,oci 的接口均试过了,都不成功,请问有人知道怎么解决吗? 解决方案 看下返回什么错误信息,然后才好判断,比如odbc驱动. 解决方案二: 连接字符串是封装在c++中没?如果是java传递的,那可能字符串传进来有问题

无法打开lib文件-vs2010无法打开libmysql.lib,非设置路径错误,急求解答,谢谢了

问题描述 vs2010无法打开libmysql.lib,非设置路径错误,急求解答,谢谢了 按网上的在c/c++和链接器中分别添加文件夹和lib文件后,运行程序总是无法打开libmysql.lib,这个lib文件是存在的,路径也没错,求帮忙 解决方案 你这个问题描述不够详细,是在运行的时候报错,还是在编译链接的时候报错. 如果是链接的时候报错,可能就是路径设置问题,如果是运行出错,那应该是需要dll而不是需要lib文件. 希望你能更详细的描述一下. 解决方案二: 如果存在,那么libmysql.l

bootstrap modal弹出框 关闭后会再弹出一次 急求解答

问题描述 bootstrap modal弹出框 关闭后会再弹出一次 急求解答 <!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>alert_modal弹出

网站发布 +-求解答:如何发布动态网站(发布网站后可以从第二台电脑访问)

问题描述 求解答:如何发布动态网站(发布网站后可以从第二台电脑访问) 我用的开发工具是Microsoft Visual Studio 2010,数据库为SQL Server 2005语言为C# 解决方案 网站天生就是可以被多台电脑访问的,只要你IIS部署好了,并且防火墙关了.... 就算你不发布,只要编译过了,并且把网站配置到了IIS里面,别人就可以访问 如果要发布的话,在项目上右键--发布就可以了 解决方案二: 服务器上安装iis,安装.net框架,发布网站就好了.

曲线拟合-MATLAB问题急求解答 急求急求

问题描述 MATLAB问题急求解答 急求急求 对于曲线 y=|sinxsin0.2x|在区间[110]内以步长0.5取点,对原函数进行三次多项式曲线拟合,绘制对比图形.

mysql 存储过程 1242-mysql 存储过程 在线急求解答!!!

问题描述 mysql 存储过程 在线急求解答!!! BEGIN /*起始时间|上车时间*/ DECLARE startime varchar(20); /*结束时间|下车时间*/ DECLARE endtime varchar(20) ; /*上车站号*/ DECLARE upnum int(11) ; /*循环判断条件*/ DECLARE b varchar(10); /*避免死循环,设置循环次数*/ DECLARE i int(11) ; /*当前站号*/ DECLARE starnum i

文本显示-js点击显示再点击隐藏的问题,急求解答

问题描述 js点击显示再点击隐藏的问题,急求解答 相关代码如下 $(function(){ $(".serlist_bd_station_jingting").hide(); $(".stopdetail").click(function(){ $(".serlist_bd_station_jingting",this).toggle(300); }) }) <ul class="serlist_box_inner clearfi

急求电信彩信网关java开发库

问题描述 急求电信彩信网关java开发库 小弟正在开一个彩信平台,已经完成移动和联通的彩信网关接入,电信的一直在网上找不到 合适的jar包,哪位兄弟手上有,烦请帮忙