none
Lector de tarjeta RRS feed

  • Pregunta

  • Buenas,estoy intentando hacer un lector de tarjetas que me permita leer un dni electronico y obtener su certificado.

    He comenzado a implementar el codigo de lectura de la tarjeta y me da el siguiente error en sCardConnect

    'PInvokeStackImbalance': 'Una llamada a la función PInvoke

    ::SCardConnect' impidió la correspondencia de la pila. Es posible que la razón sea que la signatura PInvoke administrada no coincida con la signatura de destino no administrada. Compruebe que la convención y los parámetros de llamada de la signatura PInvoke coinciden con la signatura no administrada de destino.'

    El codigo que estoy ejecutando es el siguiente.

    Dim tarjeta As String = 0
            Dim lngresult As Long
            Dim sGroup As String = New System.String(vbNullChar)
            Dim leerlistado As String
            Dim RdrCount As Long
            Dim LeerModelo
            leerlistado = New System.String(vbNullChar, 1024)
            RdrCount = leerlistado.Length
            Dim SEstatus As Integer
            Dim hcard = 1
            Dim activeprotocol = 1
    
            lngresult = SCardEstablishContext(SCARD_SCOPE_SYSTEM, 0, 0, tarjeta)
    
            LeerModelo = SCardListReaders(tarjeta, sGroup, leerlistado, RdrCount)
    
            SEstatus = SCardConnect(tarjeta, leerlistado, 1, 0 Or 1, hcard, 1)
    Si alguien tiene realizado algo similar me vendria muy bien su ayuda.

    martes, 16 de marzo de 2021 15:57

Respuestas

  • bueno en ese caso habría que ver si los valores que introduces son los que tus métodos necesitan para que te retorne el resultado esperado no se si estas haciendo todo eso basándose en algún ejemplo que viste en alguna pagina pero estos trozos de códigos no me convencen 
    Dim texto3 As String = ""
            Dim comunica2 As String = " "
            For i = 0 To 16
                comunica2 = comunica2 & (recvbuff(i) & ",")
                texto3 = texto3 & Conversion.Hex(recvbuff(i))
            Next
            ListBox1.Items.Add("Tercera Comunicación : " & comunica2 & "  // Hexadecimal: " & texto3)
            ListBox1.Items.Add("")
    lo digo porque se me hace raro que la parte de los ListBox están afuera del For Next segun mi logica tendria que estar dentro ya hacerlo haci es como decirle que el ListBox1 solo va tener el ultimo valor en el índice 16 que en el caso de tu For Next tiene una iteración desde 0 a 16 como dije es segun mi logica igual deberías probar a poner los ListBox dentro del For Next a ver que pasa saludos y buenos días
     
    • Editado DANTE-3D lunes, 22 de marzo de 2021 12:00
    • Marcado como respuesta EricRRModerator lunes, 29 de marzo de 2021 19:46
    lunes, 22 de marzo de 2021 12:00

Todas las respuestas

  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 16 de marzo de 2021 17:10
    Moderador
  • si te da ese error es porque los parámetros del método no coinciden con los parámetros correctos eso es porque creaste un método que invoca a una función no administrada y los parámetros de la función no administrada no son los mismos que el metodo que  esta invocando prueba a quitar el Or y si no se soluciona pues mira a ver cual de los parámetros no es el correcto o no son los correctos
    martes, 16 de marzo de 2021 20:06
  • Hola, 

    ya tenias razon. Era ese el problema. 

    ahora con el codigo que tengo no consigo leer el numero de DNI, ni el nombre ni nada. Alguien podria ayudarme?
    He visto que hay una solucion en "Lector de tarjetas" pero no me funciona. Cuando tendria que coger el numero de DNi y toda la informacion me devuelve 0. 

    Tambien me gustaria saber el valor que suele tener hCard ya que me da como valor -369033156 y no se si es correcto

      Dim tarjeta As String = 0
            Dim lngresult As Long
            Dim sGroup As String = New System.String(vbNullChar)
            Dim leerlistado As String
            Dim RdrCount As Long
            Dim LeerModelo
            leerlistado = New System.String(vbNullChar, 1024)
            RdrCount = leerlistado.Length
            Dim SEstatus As Integer
            Dim hcard = 1
            Dim activeprotocol = 1
            Dim Sdescone As Integer
    
    
    
            lngresult = SCardEstablishContext(SCARD_SCOPE_SYSTEM, 0, 0, tarjeta)
    
    
            LeerModelo = SCardListReaders(tarjeta, sGroup, leerlistado, RdrCount)
    
    
    
            SEstatus = SCardConnect(tarjeta, leerlistado, 1, 0 Or 1, hcard, ActiveProtocol:=1)
    
          
    
            Dim protocol = 1
            Dim lState As Integer
            Dim bAtr(32) As Byte
            Dim lAtrLen As Integer
            Dim lresult As Integer
    
            lAtrLen = 255
            Dim szReaderList As New System.String(Chr(32), 256)
            lresult = SCardStatus(hcard, szReaderList, Len(szReaderList), lState, protocol, bAtr(0), lAtrLen)
    
            Dim texto As String = ""
            Dim atrcompleto As String = Space(33)
            For i = 0 To 32
                atrcompleto = atrcompleto & "-" & Conversion.Hex(bAtr(i))
                If bAtr(i) > 48 And bAtr(i) < 123 Then texto = texto & Convert.ToChar(bAtr(i)) Else texto = texto & " "
            Next
            ListBox1.Items.Add("atr de tarjeta: " & atrcompleto)
            ListBox1.Items.Add("texto: " & texto)
            SCardBeginTransaction(hcard)
    
    
            Dim apdu As APDURec
            apdu.bCLA = &HBC
            apdu.bINS = &HB0
            apdu.bP1 = &H9
            apdu.bP2 = &HC0
            apdu.bP3 = 7
            apdu.IsSend = True
            ReDim apdu.Data(7)
            apdu.Data(0) = &H0
            apdu.Data(1) = &HA4
            apdu.Data(2) = &H0
            apdu.Data(3) = &H0
            apdu.Data(4) = &H2
            apdu.Data(5) = &H50
            apdu.Data(6) = &H15
            Dim pioSendRequest As SCARD_IO_REQUEST
            Dim pioRecvRequest As SCARD_IO_REQUEST
            pioSendRequest.dwProtocol = SCARD_PROTOCOL_T0
            pioSendRequest.cbPciLength = 8
            pioRecvRequest.dwProtocol = SCARD_PROTOCOL_T0
            pioRecvRequest.cbPciLength = 8
            Dim sendBuff(256) As Byte
    
    
            Dim recvbuff As Byte() = New Byte(255) {}
            Dim recvBuffLen As Integer
    
            Dim sTemp As String
    
            sendBuff(0) = &H0
            sendBuff(1) = &HA4
            sendBuff(2) = &H0
            sendBuff(3) = &H0
            sendBuff(4) = &H2
            sendBuff(5) = &H50
            sendBuff(6) = &H15
            
            recvBuffLen = recvBuff.Length
            
            sTemp = ""
            lresult = SCardTransmit(hcard, pioSendRequest, sendBuff(0), 7, pioRecvRequest, recvbuff(0), 2)
            SCardReleaseContext(hcard)
    
            Dim comunica As String = " " : Dim texto1 = ""
            For i = 0 To 1
                comunica = comunica & (recvbuff(i) & ",")
                texto1 = texto1 & Conversion.Hex(recvbuff(i))
            Next
            ListBox1.Items.Add("Primera Comunicación : " & comunica & "  // Hexadecimal: " & texto1)
            ListBox1.Items.Add("")
    
            '\x00\xA4\x00\x00\x02\x60\x04 envío de este código
            'segunda scardtransmit
            sendBuff(0) = &H0
            sendBuff(1) = &HA4
            sendBuff(2) = &H0
            sendBuff(3) = &H0
            sendBuff(4) = &H2
            sendBuff(5) = &H60
            sendBuff(6) = &H4
           
            recvBuffLen = recvbuff.Length
            lresult = SCardTransmit(hcard, pioSendRequest, sendBuff(0), 7,pioRecvRequest, recvbuff(0), 2)
            SCardReleaseContext(hcard)
            Dim texto2 As String = ""
            Dim comunica1 As String = " "
            For i = 0 To 1
                comunica1 = comunica1 & (recvbuff(i) & ",")
                texto2 = texto2 & Conversion.Hex(recvbuff(i))
            Next
            ListBox1.Items.Add("Segunda Comunicación : " & comunica1 & "  // Hexadecimal: " & texto2)
            ListBox1.Items.Add("")
            '00 C0 00 00 0 comprobar el peso del archivo.
            'tercera transmision
            sendBuff(0) = &H0
            sendBuff(1) = &HC0
            sendBuff(2) = &H0
            sendBuff(3) = &H0
            sendBuff(4) = &HE
            sendBuff(5) = Nothing
            sendBuff(6) = Nothing
    
            recvBuffLen = 260
            lresult = SCardTransmit(hcard, pioSendRequest, sendBuff(0), 5, pioRecvRequest, recvbuff(0), 16)
            SCardReleaseContext(hcard)
    
            Dim texto3 As String = ""
            Dim comunica2 As String = " "
            For i = 0 To 16
                comunica2 = comunica2 & (recvbuff(i) & ",")
                texto3 = texto3 & Conversion.Hex(recvbuff(i))
            Next
            ListBox1.Items.Add("Tercera Comunicación : " & comunica2 & "  // Hexadecimal: " & texto3)
            ListBox1.Items.Add("")
    
    
            '\x00\xb0\x00\x00\xff envío de este código
            '00 B0 00 FF FF // 00 B0 01 FE FF // 00 B0 02 FD FF // 00 B0 03 FC FF // 00 B0 04 FB 15 '
            'Cuarta transmision, recepción de los datos del dni
            sendBuff(0) = &H0
            sendBuff(1) = &HB0
            sendBuff(2) = &H4
            sendBuff(3) = &HFB
            sendBuff(4) = &H15
    
    
    
            recvBuffLen = 257
            lresult = SCardTransmit(hcard, pioSendRequest, sendBuff(0), 5, pioRecvRequest, recvbuff(0), recvBuffLen)
            SCardReleaseContext(hcard)
    
           
    
    
    
            For i = 0 To 255
                ListBox1.Items.Add("Número: " & i & " // " & recvbuff(i) & " == " & Convert.ToChar(recvbuff(i)))
            Next i
    
    
    
    
            SCardEndTransaction(hcard, Nothing)
            Sdescone = SCardDisconnect(hcard, SCARD_LEAVE_CARD)



    • Editado an91 miércoles, 17 de marzo de 2021 15:28
    miércoles, 17 de marzo de 2021 15:25
  • cual es exactamente el error o si se ejecuta la aplicación pero lo que te retorna no es lo esperado?
    jueves, 18 de marzo de 2021 12:23
  • Buenas, lo que me retorna no es lo esperado ya que es 0
    lunes, 22 de marzo de 2021 7:21
  • bueno en ese caso habría que ver si los valores que introduces son los que tus métodos necesitan para que te retorne el resultado esperado no se si estas haciendo todo eso basándose en algún ejemplo que viste en alguna pagina pero estos trozos de códigos no me convencen 
    Dim texto3 As String = ""
            Dim comunica2 As String = " "
            For i = 0 To 16
                comunica2 = comunica2 & (recvbuff(i) & ",")
                texto3 = texto3 & Conversion.Hex(recvbuff(i))
            Next
            ListBox1.Items.Add("Tercera Comunicación : " & comunica2 & "  // Hexadecimal: " & texto3)
            ListBox1.Items.Add("")
    lo digo porque se me hace raro que la parte de los ListBox están afuera del For Next segun mi logica tendria que estar dentro ya hacerlo haci es como decirle que el ListBox1 solo va tener el ultimo valor en el índice 16 que en el caso de tu For Next tiene una iteración desde 0 a 16 como dije es segun mi logica igual deberías probar a poner los ListBox dentro del For Next a ver que pasa saludos y buenos días
     
    • Editado DANTE-3D lunes, 22 de marzo de 2021 12:00
    • Marcado como respuesta EricRRModerator lunes, 29 de marzo de 2021 19:46
    lunes, 22 de marzo de 2021 12:00