问题描述
最近研究读取一卡通卡号的问题,对方给了动态库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出来,结构体内已经存在了。直接复制到结构体内。