EIDPT.init(), SC_ERROR_OBJECT_NOT_FOUND e E_NOT_INITIALIZED

Apr 11, 2014 at 7:01 PM
Boa tarde,

Tenho uma aplicação onde estou a tentar ler os dados do cartão através do evento "void scWatcher_CardInserted(string readerName, string cardName) ",no entanto sempre que tento inicializar a biblioteca EIDPT surge o erro SC_ERROR_OBJECT_NOT_FOUND.
Isto acontece quando inicio a minha aplicação sem ter o cartão inserido no leitor.
Quando inicio a aplicação com o cartão já inserido tudo funciona.

Como resolvo este problema?

Obrigado pela atenção
Apr 18, 2014 at 6:06 PM
Edited Apr 18, 2014 at 6:11 PM
Olá.

Resolvi o problema que descreve colocando a seguinte lógica no evento _SCWatcher_CardInserted(readerName As String, cardName As String):
Private Sub m_SCWatcher_CardInserted(readerName As String, cardName As String)

    Try

        If readerName <> m_CurrentReaderName OrElse m_CitizenCardIsPresent OrElse Not m_KnownCards.Contains(cardName) Then

            If String.IsNullOrEmpty(value:=cardName) = 0 AndAlso m_RaiseEventCardIncorrectlyInserted Then

                RaiseEvent CardInserted(readerName:=readerName, cardName:=cardName, cardCorrectlyInserted:=False)

                m_CardIncorrectlyInserted = True

            End If

            m_RaiseEventCardIncorrectlyInserted = True

            Exit Sub

        End If

        RaiseEvent CardInserted(readerName:=readerName, cardName:=cardName, cardCorrectlyInserted:=True)

        Try

            EIDPT.Init(readerName)

        Catch ex As EIDPTException

            EIDPT.Exit(ExitMode.LEAVE_CARD)
            RaiseEvent ErrorInsertCard(Me, ex)

            Exit Sub

        End Try

        m_CurrentReaderName = readerName
        EIDPT.SetSODChecking(doCheck:=False)
        m_CitizenCardIsPresent = True
        m_CardIncorrectlyInserted = False
        m_RaiseEventCardIncorrectlyInserted = False

        RaiseEvent CardReadyToRead(readerName:=readerName, cardName:=cardName)

    Catch ex As Exception

        RaiseEvent Error(Me, ex)

    End Try

End Sub
m_KnownCards é uma List(Of String) inicializada no construtor da classe do seguinte modo:
Private Sub New() ' A Class é shared. Por isso é que o construtor é privado.

    Try

        RemoveEventHandlers()

        m_KnownCards = New List(Of String)(New String() _
                                           {
                                            "3B 7D 95 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00",
                                            "3B 95 95 40 FF D0 00 54 01 31",
                                            "3B 95 95 40 FF D0 00 54 01 32",
                                            "3B 7B 94 00 00 80 65 B0 83 01 01 74 83 00 90 00",
                                            "3B 6B 00 00 80 65 B0 83 01 01 74 83 00 90 00",
                                            "3B 6B 00 00 80 65 B0 83 01 03 74 83 00 90 00",
                                            "3B 7A 94 00 00 80 65 A2 01 01 01 3D 72 D6 43",
                                            "3B 7D 94 00 00 80 31 80 65 B0 83 01 01 90 83 00 90 00",
                                            "3B 65 00 00 D0 00 54 01 31",
                                            "3B 65 00 00 D0 00 54 01 32",
                                            "3B 95 95 40 FF D0 00 54 01 31",
                                            "3B 95 95 40 FF D0 00 54 01 32",
                                            "3B 7D 95 00 00 80 31 80 65 B0 83 11 C0 A9 83 00",
                                            "3B 7D 95 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00",
                                            "3B 7D 95 00 00 80 31 80 65 B0 83 11 00 C8 83 00",
                                            "3B 7D 95 00 00 80 31 80 65 B0 83 11 00 C8 83 00 90 00"
                                            }
                                           )

        m_NotesFilePath = {&H3F, &H0, &H5F, &H0, CByte(&HEF), &H7}
        m_SCWatcher = SCWatcher.GetInstance
        m_SCWatcher.Start() ' Invocar Start explicitamente, caso contrário o daemon usado em
        ' instâncias anteriores da classe será retornado e o evento CardInserted não será despoletado.
        m_readerList = New List(Of String)(m_SCWatcher.ListReaders())

        If m_readerList IsNot Nothing AndAlso m_readerList.Count > 0 Then

            m_CurrentReaderName = m_readerList(0)
            AddEventHandlers()

        End If

    Catch ex As Exception

        Dim lbwEx As New LBWException(ex)
        Throw

    End Try

End Sub
CardInserted e CardReadyToRead são eventos criados por mim na classe.

A variável m_CardIncorrectlyInserted é inicalizada com o valor False:
Private Shared m_CardIncorrectlyInserted As Boolean = False
Espero que ajude.