Winscard – problem z wychwyceniem kontaktu

0

Witam,
piszę sobie prosty program przy użyciu winscard.h. Bez problemu odnajduje mój czytnik i ustala połączenie z nim. Niestety, kiedy uruchamiam SCardGetStatusChange cały czas dostaję błąd 0x80110457 - "The specified partition name is already in use on this computer"

Oto fragment kodu odpowiadający za to:

bool NFCReader::waitForCard(QString readerName, DWORD timeout)
{
    bool foundCard = false;

    lReturn = SCardGetStatusChangeA(hContext,timeout,rgscState,*readerName.toStdString().c_str());

    if( lReturn == SCARD_S_SUCCESS)
    {
        for(auto pos = readerState.begin(); pos != readerState.end(); ++pos)
        {
            if (((pos->dwCurrentState & SCARD_STATE_PRESENT) == 0) &&
                                (pos->dwEventState & SCARD_STATE_PRESENT))
            {
//                readerName = pos->szReader;
                foundCard = true;
            }

            pos->dwCurrentState = pos->dwEventState & ~SCARD_STATE_CHANGED;
        }
    }
    else
    {
        qDebug() << getErrorCode(lReturn) << " " << lReturn;
    }

    return foundCard;
}
0

Sprawdzałeś czy urządzenie rzeczywiście jest gdzieś używane?

edit: Z tego co widzę tutaj konkretny błąd to:
COMADMIN_E_CAT_DUPLICATE_PARTITION_NAME
Więc wygląda to tak, jakbyś podawał nazwę istniejącą już na Twojej maszynie.

0

Process Explorer Search nic nie znalazł. A to nie jest tak, że z listy nazw urządzeń mam brać tę nazwę? Najpierw robię listę, a potem z niej wybieram nazwę urządzenia.

QVector("HID Global OMNIKEY 5422 Smartcard Reader 0", "HID Global OMNIKEY 5422CL Smartcard Reader 0")

0

Pytasz o rzecz, która jest bardzo specjalistyczna i mało znana.
Mało kto pracuje z NFC, więc szansa na pomoc na forum są nikłe.
Dlatego, jeśli chcesz pomocy masz dwa wyjścia:

  • podać więcej kontekstu, np skąd czerpiesz wiedzę jak ot powinno być zrobione, może więcej kodu. Wtedy inni się podszkolą i może wyłapią co jest nie tak z twoim kodem (np źle zrozumiałeś dokumentację)
  • albo spróbować skierować pytanie do większej publiki (stackoverflow), by mieć większe szanse natrafienia na kogoś z odpowiednim doświadczeniem (z mojego doświadczania też może być trudno o odpowiedź). Możesz też poszukać forum/QA tematycznego o programowaniu NFC (tam miałbyś największe szanse).
0

Znalazłem trochę słabe obejście, ponieważ ma jedną wadę, ale daje radę.
Zrezygnowałem z metody obserwacji, czy karta/tag został zbliżony do czytnika, tylko w pętli wykonuję SELECT na czytniku. Jeżeli zbliżymy do niego kartę to zareaguje prawidłowo i odczyta zawartość i zwróci 0. Natomiast, jeżeli nie uda mu się nawiązać podczas selectu kontaktu z jakąkolwiek kartą, to zwraca (jeszcze nie wydedukowałem dokładnie jaki to błąd) dużą ujemną liczbę, co wystarczy, aby zapobiec zebraniu śmieci z pamięci, jeżeli nic nie odczytał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1