各位大大, 小子是 delphi 新手, 请各位帮我把以下代码换成DELPHI中代码班:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function ConvHexToDec Lib "CONVERTHEXDEC.DLL" (ByVal strMfgNo$, ByVal strMfgNoOut$) As IntegerPrivate ReaderCommPort As Integer
Private Output() As Byte
Private ChkSum As Integer
Private ls_MfgStr As String
Private li_ReturnVal As Integer
Private CardNo As String
Private TimeOut As Boolean
Private BlockNo As Integer
Private KeyStr As String
Private CardType As String
Private gs_Info As String
Private ExistingBalance As Double, NewBalance As Double, TopUpValue As DoublePrivate Sub cmdClose_Click()
    End
End SubPrivate Sub cmdReadCard_Click()
    On Error GoTo err
    
    CardNo = ""
    txtCardNo.Text = ""
    txtExtBal.Text = ""
    txtTopUp.Text = ""
    txtNewBal.Text = ""
    
    ChkSum = 2 Xor 1 Xor Val("&H" & "ED") Xor 0
    ReDim Output(5) As Byte
    
    Output(0) = 2  'Header
    Output(1) = 1  'ID
    Output(2) = Val("&H" & "ED") 'Command
    
    Output(3) = 0  'Data Length
    
    Output(4) = ChkSum
    Output(5) = 3    If funReadWriteCard(18) = 0 Then
        BlockNo = 9
        ChkSum = 2 Xor 1 Xor Val("&H" & "EC") Xor 8 Xor Trim(Val("&H" & BlockNo)) Xor _
                0 Xor Val("&H" & Mid(KeyStr, 1, 2)) Xor Val("&H" & Mid(KeyStr, 3, 2)) Xor _
                Val("&H" & Mid(KeyStr, 5, 2)) Xor Val("&H" & Mid(KeyStr, 7, 2)) Xor _
                Val("&H" & Mid(KeyStr, 9, 2)) Xor Val("&H" & Mid(KeyStr, 11, 2))
                
        ReDim Output(13) As Byte
        
        Output(0) = 2                           'header
        Output(1) = 1                           'id
        Output(2) = Val("&H" & "EC")
        Output(3) = 8                           'length
        
        Output(4) = Trim(Val("&H" & BlockNo))   '8
        Output(5) = 0
        Output(6) = Val("&H" & Mid(KeyStr, 1, 2))
        Output(7) = Val("&H" & Mid(KeyStr, 3, 2))
        Output(8) = Val("&H" & Mid(KeyStr, 5, 2))
        Output(9) = Val("&H" & Mid(KeyStr, 7, 2))
        Output(10) = Val("&H" & Mid(KeyStr, 9, 2))
        Output(11) = Val("&H" & Mid(KeyStr, 11, 2))
        
        Output(12) = ChkSum
        Output(13) = 3
        
        If funReadWriteCard(19) = 0 Then
            If CardType = "E" Then
                BlockNo = 8
                ChkSum = 2 Xor 1 Xor Val("&H" & "EC") Xor 8 Xor Trim(Val("&H" & BlockNo)) Xor _
                         0 Xor Val("&H" & Mid(KeyStr, 1, 2)) Xor Val("&H" & Mid(KeyStr, 3, 2)) Xor _
                         Val("&H" & Mid(KeyStr, 5, 2)) Xor Val("&H" & Mid(KeyStr, 7, 2)) Xor _
                         Val("&H" & Mid(KeyStr, 9, 2)) Xor Val("&H" & Mid(KeyStr, 11, 2))
                        
                ReDim Output(13) As Byte
                
                Output(0) = 2                           'header
                Output(1) = 1                           'id
                Output(2) = Val("&H" & "EC")
                Output(3) = 8                           'length
                
                Output(4) = Trim(Val("&H" & BlockNo))   '8
                Output(5) = 0
                Output(6) = Val("&H" & Mid(KeyStr, 1, 2))
                Output(7) = Val("&H" & Mid(KeyStr, 3, 2))
                Output(8) = Val("&H" & Mid(KeyStr, 5, 2))
                Output(9) = Val("&H" & Mid(KeyStr, 7, 2))
                Output(10) = Val("&H" & Mid(KeyStr, 9, 2))
                Output(11) = Val("&H" & Mid(KeyStr, 11, 2))
                
                Output(12) = ChkSum
                Output(13) = 3
                
                If funReadWriteCard(19) = 0 Then
                    txtExtBal.Text = Format(ExistingBalance, "####0.00")
                End If
            Else
                MsgBox "Sorry, this is not an epurse card!", vbCritical + vbOKOnly, "Epurse"
                txtCardNo.Text = ""
                CommReader.PortOpen = False
                Exit Sub
            End If
        Else
            MsgBox "Sorry, invalid card!", vbCritical + vbOKOnly, "Epurse"
            txtCardNo.Text = ""
            CommReader.PortOpen = False
            Exit Sub
        End If
    Else
        MsgBox "Cannot Read Card!", vbCritical + vbOKOnly, "Epurse"
        txtCardNo.Text = ""
        CommReader.PortOpen = False
        Exit Sub
    End If
    
    Exit Sub
err:
    MsgBox "Event : cmdReadCard_Click" & vbCrLf & "[" & err.Number & "]" & " : " & err.Description
End SubPrivate Sub cmdWriteCard_Click()
    Dim TempData As String, DataWrite As String, HexStr As String
    Dim i As Integer
            
    NewBalance = ExistingBalance + txtTopUp.Text
    txtNewBal.Text = Format(NewBalance, "####0.00")
    
    TempData = g_pb_FunFmValToStr(NewBalance * 100, 4, True)
    For i = 1 To 4
        HexStr = Hex(Asc(Mid(TempData, i, 1)))
        If Len(HexStr) = 2 Then
            HexStr = HexStr
        Else
            HexStr = "0" & HexStr
        End If
        DataWrite = DataWrite & HexStr
    Next
    
    Debug.Print DataWrite
    BlockNo = 8
    
    ChkSum = 2 Xor 1 Xor Val("&H" & "EB") Xor 24 Xor Val("&H" & BlockNo) Xor _
             0 Xor Val("&H" & Mid(KeyStr, 1, 2)) Xor Val("&H" & Mid(KeyStr, 3, 2)) Xor _
             Val("&H" & Mid(KeyStr, 5, 2)) Xor Val("&H" & Mid(KeyStr, 7, 2)) Xor _
             Val("&H" & Mid(KeyStr, 9, 2)) Xor Val("&H" & Mid(KeyStr, 11, 2)) Xor _
             Val("&H" & Mid(DataWrite, 1, 2)) Xor Val("&H" & Mid(DataWrite, 3, 2)) Xor _
             Val("&H" & Mid(DataWrite, 5, 2)) Xor Val("&H" & Mid(DataWrite, 7, 2)) Xor _
             Val("&H" & Mid(gs_Info, 1, 2)) Xor Val("&H" & Mid(gs_Info, 3, 2)) Xor _
             Val("&H" & Mid(gs_Info, 5, 2)) Xor Val("&H" & Mid(gs_Info, 7, 2)) Xor _
             Val("&H" & Mid(gs_Info, 9, 2)) Xor Val("&H" & Mid(gs_Info, 11, 2)) Xor _
             Val("&H" & Mid(gs_Info, 13, 2)) Xor Val("&H" & Mid(gs_Info, 15, 2)) Xor _
             Val("&H" & Mid(gs_Info, 17, 2)) Xor Val("&H" & Mid(gs_Info, 19, 2)) Xor _
             Val("&H" & Mid(gs_Info, 21, 2)) Xor Val("&H" & Mid(gs_Info, 23, 2))    ReDim Output(29) As Byte    Output(0) = 2
    Output(1) = 1
    Output(2) = Val("&H" & "EB")
    Output(3) = 24    Output(4) = Val("&H" & BlockNo)
    Output(5) = 0
    Output(6) = Val("&H" & Mid(KeyStr, 1, 2))
    Output(7) = Val("&H" & Mid(KeyStr, 3, 2))
    Output(8) = Val("&H" & Mid(KeyStr, 5, 2))
    Output(9) = Val("&H" & Mid(KeyStr, 7, 2))
    Output(10) = Val("&H" & Mid(KeyStr, 9, 2))
    Output(11) = Val("&H" & Mid(KeyStr, 11, 2))    Output(12) = Val("&H" & Mid(DataWrite, 1, 2))
    Output(13) = Val("&H" & Mid(DataWrite, 3, 2))
    Output(14) = Val("&H" & Mid(DataWrite, 5, 2))
    Output(15) = Val("&H" & Mid(DataWrite, 7, 2))    Output(16) = Val("&H" & Mid(gs_Info, 1, 2))
    Output(17) = Val("&H" & Mid(gs_Info, 3, 2))
    Output(18) = Val("&H" & Mid(gs_Info, 5, 2))
    Output(19) = Val("&H" & Mid(gs_Info, 7, 2))
    Output(20) = Val("&H" & Mid(gs_Info, 9, 2))
    Output(21) = Val("&H" & Mid(gs_Info, 11, 2))
    Output(22) = Val("&H" & Mid(gs_Info, 13, 2))
    Output(23) = Val("&H" & Mid(gs_Info, 15, 2))
    Output(24) = Val("&H" & Mid(gs_Info, 17, 2))
    Output(25) = Val("&H" & Mid(gs_Info, 19, 2))
    Output(26) = Val("&H" & Mid(gs_Info, 21, 2))
    Output(27) = Val("&H" & Mid(gs_Info, 23, 2))    Output(28) = ChkSum
    Output(29) = 3    If funReadWriteCard(20) = 0 Then
        MsgBox "Success !", vbInformation + vbOKOnly, "Epurse"
    Else
        MsgBox "Write Card Failed !" & vbCrLf & "Please Try Again.", vbCritical + vbOKOnly, "Epurse"
'        txtCardNo.Text = ""
        CommReader.PortOpen = False
        Exit Sub
    End If
End SubPrivate Sub Form_Load()
    KeyStr = "FFFFFFFFFFFF"
    ReaderCommPort = 4
End Sub

解决方案 »

  1.   

    Private Sub tmrTimeOut_Timer()
        TimeOut = True
        tmrTimeOut.Enabled = False
    End SubPublic Function funReadWriteCard(ByRef Command As Byte) As Long
        On Error GoTo err
        Dim tempInputReader As String
        Dim InputReader As String
        Dim z As Integer
        Dim i As Integer
        Dim FinishInput As Integer
        Dim out(0) As Byte    If CommReader.PortOpen = False Then
            CommReader.Settings = "57600,N,8,1"
            CommReader.CommPort = ReaderCommPort
            CommReader.PortOpen = True
        End If    CommReader.InputLen = 1
        CommReader.InBufferCount = 0
        CommReader.OutBufferCount = 0    For i = LBound(Output) To UBound(Output)
            out(0) = Output(i)
            CommReader.Output = out
        Next
            
        TimeOut = False
        tmrTimeOut.Enabled = True
        
        Sleep (10)
        Do
        DoEvents    Loop Until TimeOut = True Or CommReader.InBufferCount <> 0
        
        tmrTimeOut.Enabled = False
        If TimeOut = False Then
            Do
            DoEvents
                tempInputReader = CommReader.Input(0)
                Sleep (10)
                
                If tempInputReader <> "" Then
                    If InputReader = "" Then
                        InputReader = tempInputReader
                        z = z + 1
                    Else
                        InputReader = InputReader & ";" & tempInputReader
                        z = z + 1
                    End If
                    
                    Select Case Command
                        Case 18
                            'read card no
                            If z = 10 Then
                                FinishInput = funBCCCompare(InputReader, Command, 10)
                            ElseIf z = 6 Then
                                FinishInput = funBCCCompare(InputReader, Command, 6)
                            End If
                        Case 19
                            'read block data
                            If z = 26 Then '22 Then
                                FinishInput = funBCCCompare(InputReader, Command, 22)
                            ElseIf z = 6 Then
                                FinishInput = funBCCCompare(InputReader, Command, 6)
                            End If
                        Case 20
                            'write card
                            If z = 6 Then
                                FinishInput = funBCCCompare(InputReader, Command, 0)
                            End If
                    End Select
                End If
            Loop Until TimeOut = True Or FinishInput = 99 Or FinishInput = 1
            
            If FinishInput = 99 Then
                funReadWriteCard = 1
            End If
        ElseIf TimeOut = True Then
            funReadWriteCard = 1    'timeOut
        End If    Exit Function
    err:
        funReadWriteCard = 1
        MsgBox err.Description
    End Function
      

  2.   

    Public Function funBCCCompare(ByRef BCC As String, ByRef Command As Byte, ByRef Length As Integer)
        On Error GoTo err
        Dim tempSplit
        Dim TempData As String
        Dim tempChkSum As String
        Dim i As Integer
        Dim TExistingBalance As String
        Dim HexStr As String    Select Case Command
            Case 18
                'read card no
                If Length = 10 Then
                    'Debug.Print BCC
                    tempSplit = Split(BCC, ";")
                    
                    tempChkSum = tempSplit(0) Xor tempSplit(1) Xor tempSplit(2) Xor _
                                tempSplit(3) Xor tempSplit(4) Xor tempSplit(5) Xor _
                                tempSplit(6) Xor tempSplit(7)
                    
                    If tempSplit(9) <> 3 Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                                
                    If tempSplit(8) <> tempChkSum Then
                        funBCCCompare = 99
                        txtCardNo.Text = ""
                        Exit Function
                    Else
                        TempData = ""
                        For i = 7 To 4 Step -1
                            If Len(Hex(tempSplit(i))) = 1 Then
                                TempData = TempData & "0" & Hex(tempSplit(i))
                            Else
                                TempData = TempData & Hex(tempSplit(i))
                            End If
                        Next i
                        
                        ls_MfgStr = Space(50)
                        li_ReturnVal = ConvHexToDec(TempData, ls_MfgStr)
                        CardNo = Format(Mid(ls_MfgStr, 1, 10), "0000000000")
                        
                        Debug.Print CardNo
                        txtCardNo.Text = CardNo
                        funBCCCompare = 1
                    End If
                ElseIf Length = 6 Then
                    tempSplit = Split(BCC, ";")
                    
                    If tempSplit(5) = 3 And tempSplit(2) = 255 Then
                        funBCCCompare = 99
                        txtCardNo.Text = ""
                        Exit Function
                    End If
                End If
            Case 19
                'read block data
                If Length = 22 Then
                    tempSplit = Split(BCC, ";")
                    Debug.Print BCC
                    
                    tempChkSum = tempSplit(0) Xor tempSplit(1) Xor tempSplit(2) Xor _
                                tempSplit(3) Xor tempSplit(4) Xor tempSplit(5) Xor _
                                tempSplit(6) Xor tempSplit(7) Xor tempSplit(8) Xor _
                                tempSplit(9) Xor tempSplit(10) Xor tempSplit(11) Xor _
                                tempSplit(12) Xor tempSplit(13) Xor tempSplit(14) Xor _
                                tempSplit(15) Xor tempSplit(16) Xor tempSplit(17) Xor _
                                tempSplit(18) Xor tempSplit(19) Xor tempSplit(20) Xor _
                                tempSplit(21) Xor tempSplit(22) Xor tempSplit(23)
                    
                    If tempSplit(25) <> 3 Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(0) <> Output(0) Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(1) <> Output(1) Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(24) <> tempChkSum Then
                        funBCCCompare = 99
    '                    txtData.Text = ""
                        Exit Function
                    Else
                        If BlockNo = 8 Then
                            TempData = ""
    '                        For i = 4 To 7 '19
    '                            If Len(Hex(tempSplit(i))) = 1 Then
    '                                HexStr = "0" & Hex(tempSplit(i))
    '                            Else
    '                                HexStr = Hex(tempSplit(i))
    '                            End If
    '                            TempData = TempData & Chr(Val("&H" + HexStr))
    '                        Next i
                            
                            For i = 4 To 7
                                If Len(Hex(tempSplit(i))) = 1 Then
                                    TempData = TempData & "0" & Hex(tempSplit(i))
                                Else
                                    TempData = TempData & Hex(tempSplit(i))
                                End If
                                
                            Next
                            
                            Debug.Print TempData
                            TExistingBalance = Right(TempData, 2) & Mid(TempData, 5, 2) & Mid(TempData, 3, 2) & Left(TempData, 2)
                            ExistingBalance = (HexToDec(TExistingBalance) / 100)
                            
                            For i = 8 To 19
                                If Len(Hex(tempSplit(i))) = 1 Then
                                    gs_Info = gs_Info & "0" & Hex(tempSplit(i))
                                ElseIf Len(Hex(tempSplit(i))) = 2 Then
                                    gs_Info = gs_Info & Hex(tempSplit(i))
                                End If
                            Next i
    '                        ExistingBalance = g_pb_FunFmHexToDec(g_pb_FunFmStrToHex(TempData, True)) / 100
                        Else
                            CardType = Chr$(tempSplit(9))
                        End If
                        
                        funBCCCompare = 1
                    End If
                ElseIf Length = 6 Then
                    tempSplit = Split(BCC, ";")
                    
                    If tempSplit(5) = 3 And tempSplit(2) = 255 Then
                        funBCCCompare = 99
                        txtCardNo.Text = ""
                        Exit Function
                    End If
                End If
            Case 20
                'write card
                tempSplit = Split(BCC, ";")
                    If tempSplit(0) <> Output(0) Then    'header
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(1) <> Output(1) Then    'ID
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(2) <> 0 Then    'ID
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(3) <> 0 Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(4) <> 3 Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If
                    
                    If tempSplit(5) <> 3 Then
                        funBCCCompare = 99
                        Exit Function
                    Else
                        funBCCCompare = 1
                    End If    End Select
    Exit Function
    err:
        funBCCCompare = 99
        MsgBox err.Description
    End Function
      

  3.   

    Private Function HexToDec(String1 As String) As String
        Dim c As Long, d As Long
        Dim i As Integer
        Dim Value1 As Double, Value2 As Double
        Dim TStr As String
        Dim String2 As String
        
        TStr = ""
        For i = 1 To (8 - Len(String1))
            TStr = TStr & "0"
        Next
        
        String1 = TStr & String1
        
        d = 0
        Value1 = 0
        
        For c = Len(String1) To 1 Step -1
            String2 = Mid(String1, c, 1)
            If UCase(String2) = "A" Then String2 = "10"
            If UCase(String2) = "B" Then String2 = "11"
            If UCase(String2) = "C" Then String2 = "12"
            If UCase(String2) = "D" Then String2 = "13"
            If UCase(String2) = "E" Then String2 = "14"
            If UCase(String2) = "F" Then String2 = "15"
            Value2 = Val(String2)
            
            Value1 = Value1 + (Value2 * (16 ^ (8 - c)))
        Next
        HexToDec = Value1
    End FunctionPrivate Function g_pb_FunFmValToStr(l_val&, i_len%, Optional b_Flag As Variant) As String
        Dim l_s_Str As String, l_i_Cnt As Integer    If IsMissing(b_Flag) Then b_Flag = False    l_s_Str = Hex(l_val)
        l_s_Str = String(8 - Len(l_s_Str), "0") & l_s_Str    g_pb_FunFmValToStr = ""    If b_Flag Then
            For l_i_Cnt = 7 To 1 Step -2
                g_pb_FunFmValToStr = g_pb_FunFmValToStr & Chr("&H" & Mid(l_s_Str, l_i_Cnt, 2))
            Next
            g_pb_FunFmValToStr = Left(g_pb_FunFmValToStr, i_len)
        Else
            For l_i_Cnt = 1 To 7 Step 2
                g_pb_FunFmValToStr = g_pb_FunFmValToStr & Chr("&H" & Mid(l_s_Str, l_i_Cnt, 2))
            Next
            g_pb_FunFmValToStr = Right(g_pb_FunFmValToStr, i_len)
        End IfEnd Function