我使用vb2005调用德卡提供的dll读取卡内信息时遇到了2个问题
一是在读某些块地址时,会报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
二是当返回到应答码为读取成功时,却接收不到任何数据
德卡提供的API里dll中读取卡内信息的函数定义为:
int dc_read(int icdev,unsigned char _Adr,unsigned char *_Data);
这里_Data就是返回数据的地方
我在vb2005中声明的函数为
Private Declare Function dc_read Lib "dcrf32.dll" (ByVal icdev As Integer, ByVal _adr As Char, ByRef dataBuf As String) As Integer
自定义读卡的函数为:
'读取单程票数据
Public Function ReadTkt() As Boolean
Dim st As Integer '读取结果
ReadTkt = False
frmCardReader.Log("开始读单程票数据...")
'单程票共占用48字节
Try
'读发行区,8字节
st = dc_read(icdev, ChrW(4), dataBuf)
If (st <> 0) Then ' 读卡失败
frmCardReader.Log("读取单程票(发行区)信息失败")
Exit Function
End If
'读发行区信息成功,截取dataBuf,转换为需要的数据
frmCardReader.Log("读取单程票(发行区)信息成功:" & dataBuf)
Catch ex As Exception
ReadTkt = False
frmCardReader.Log(ex.Message)
MsgBox("读单程票失败,错误代码:[" & st & "]")
End Try
End Function
望各位看到帖子的朋友费费心,很急,多谢大家了
//函数原型:
//int __stdcall CPUPBOC_CardProtocol(HANDLE hPort,int iProtocol,
// int iInDataLen,unsigned char *pucInData,
// int *iOpState,
// int *iOutDataLen,unsigned char *pucOutData)
//函 数 名 : CPUPBOC_CardProtocol
//函数功能 : 发chip指令
//处理过程 :
//返 回 值 : int 操作状态字:
//参数说明 : HANDLE hPort,
// int iProtocol, 协议 T=0,1
// int iInDataLen, C-APDU包长度
// unsigned char *pucInData, C-APDU包
// int *iOpState, 返回操作状态字P:
// P=Y(0X59) 成功,89
// P=N(0X4E) 操作不成功,78
// P=E(0X45) 卡机无卡,69
// P=W(0X57) 卡不在允许操作的位置上 87
// int *iOutDataLen, C-APDU操作返回包长度
// unsigned char *pucOutData C-APDU操作返回包
[DllImport("DeCard_D8.dll", EntryPoint = "CPUPBOC_CardProtocol", CharSet = CharSet.Auto)]
private static extern int _CardProtocol(int hPort, int iProtocol, int iInDataLen,
byte[] pucInData, ref int iOpState, ref int iOutDataLen, [Out, MarshalAs(UnmanagedType.LPArray)]byte[] pucOutData);
#endregion
发个c#的给你参考一下。我这个也是操作德卡的
ByRef dataBuf As String
还得指定 CharSet.
char* 在 C++ 是指以 /0 结尾的字符串,也可以表示 char[] 数组(定长字符串).
因为C++中没有 byte,所以字节值用 char 表示.
如果以string 读取无法成功,就说明 char* 代表的是定长字符串,那么你就需要用C#中的byte[] 来接收定长字符串数组,然后再转换成string.