我使用vb2005調(diào)用德卡提供的dll讀取卡內(nèi)信息時(shí)遇到了2個(gè)問(wèn)題一是在讀某些塊地址時(shí),會(huì)報(bào)“嘗試讀取或?qū)懭胧鼙Wo(hù)的內(nèi)存。這通常指示其他內(nèi)存已損壞?!倍钱?dāng)返回到應(yīng)答碼為讀取成功時(shí),卻接收不到任何數(shù)據(jù)德卡提供的API里dll中讀取卡內(nèi)信息的函數(shù)定義為:
int dc_read(int icdev,unsigned char _Adr,unsigned char *_Data);
?
?
這里_Data就是返回?cái)?shù)據(jù)的地方我在vb2005中聲明的函數(shù)為
?
Private Declare Function dc_read Lib "dcrf32.dll" (ByVal icdev As Integer, ByVal _adr As Char, ByRef dataBuf As String) As Integer
自定義讀卡的函數(shù)為:
'讀取單程票數(shù)據(jù) Public Function ReadTkt() As Boolean Dim st As Integer '讀取結(jié)果 ReadTkt = False frmCardReader.Log("開(kāi)始讀單程票數(shù)據(jù)...") '單程票共占用48字節(jié) Try '讀發(fā)行區(qū),8字節(jié) st = dc_read(icdev, ChrW(4), dataBuf) If (st <> 0) Then ' 讀卡失敗 frmCardReader.Log("讀取單程票(發(fā)行區(qū))信息失敗") Exit Function End If '讀發(fā)行區(qū)信息成功,截取dataBuf,轉(zhuǎn)換為需要的數(shù)據(jù) frmCardReader.Log("讀取單程票(發(fā)行區(qū))信息成功:" & dataBuf) Catch ex As Exception ReadTkt = False frmCardReader.Log(ex.Message) MsgBox("讀單程票失敗,錯(cuò)誤代碼:[" & st & "]") End Try End Function
?
?
望各位看到帖子的朋友費(fèi)費(fèi)心,很急,多謝大家了
4 回答

桃花長(zhǎng)相依
TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
ByRef dataBuf As String
還得指定 CharSet.
char* 在 C++ 是指以 /0 結(jié)尾的字符串,也可以表示 char[] 數(shù)組(定長(zhǎng)字符串).
因?yàn)镃++中沒(méi)有 byte,所以字節(jié)值用 char 表示.
如果以string 讀取無(wú)法成功,就說(shuō)明 char* 代表的是定長(zhǎng)字符串,那么你就需要用C#中的byte[] 來(lái)接收定長(zhǎng)字符串?dāng)?shù)組,然后再轉(zhuǎn)換成string.

Smart貓小萌
TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
還是讀不出來(lái),塊地址_Adr應(yīng)該定義為什么類型,按照文檔上說(shuō)MF卡的4-15數(shù)據(jù)塊都是可讀寫(xiě)的。但為什么要報(bào)“嘗試讀取或?qū)懭胧鼙Wo(hù)的內(nèi)存”的錯(cuò)或是返回應(yīng)答碼正確,但_Data卻沒(méi)有值呢

眼眸繁星
TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
@誠(chéng)實(shí)小郎君:如果 C++ 的函數(shù)原形定義為 char *_Data ,那么就是要求調(diào)用方傳入有效的char[]數(shù)組,同時(shí)函數(shù)原形還應(yīng)該提供一個(gè)入?yún)?int size,該傳入?yún)?shù)指示你傳入的char[]的長(zhǎng)度,你防止函數(shù)在char*++時(shí)越界。如果函數(shù)原形定義為char& _Data ,那就是告訴你,它會(huì)為你分配一個(gè)char[] 數(shù)組,同時(shí)它還要提供一個(gè)傳出參數(shù),int& size,告訴你它分配了多大的char數(shù)組,以防止你使用時(shí)越界。
- 4 回答
- 0 關(guān)注
- 448 瀏覽
添加回答
舉報(bào)
0/150
提交
取消