本人新接触windows 提供得Smart card API函数,使用SCardListReaders时,总是出错。请问有否高人可以指点一二。

解决方案 »

  1.   

    我以前做过不少USB设备及无线射频卡的读写,你最好把你的问题代码发上来,大家一起帮你研究。
      

  2.   

    我想将代码上传,但又不知如何操作!
    不如我文字叙述一下问题吧。
    1。将Smart card 服务打开的时候,使用SCardEstablishContext是成功的,但获取不了读卡器的列表。更不用说连接了;
    2。若将Smart card 服务关闭,则SCardEstablishContext调用不成功,但SCardListReaders产生了列表,客列表中没有我所希望的读卡器名称;我不明白为什么会出现这种情况,请指点指点!其中部分代码如下:
    LONG ListReaders ( IN SCARDCONTEXT hContext,
                       IN LPCTSTR      lpmszReaderGroups ) 
    {
        LONG   lResult;
        DWORD  dwNumReaders   = 0;
        LPTSTR lpmszReaderNames;
        LPTSTR lpszReaderName;
        lResult = SCListReaders ( hContext, lpmszReaderGroups, (LPTSTR *) &lpmszReaderNames );
        if ( lResult != SCARD_S_SUCCESS )
        {
            printf ( ("\n#5. Error [0x%lx]: Program terminated abnormally.\n"),
                       lResult );
            return ( lResult ); 
        }    lpszReaderName = lpmszReaderNames;    printf(("\n"));
        printf(("** Registered Reader(s)\n"));
        printf(("====================\n"));    while ( *lpszReaderName != ('\0') )
        {
            printf ( ("%02d: %s\n"), ++dwNumReaders, lpszReaderName );
            lpszReaderName += lstrlen(lpszReaderName) + 1;
        }    if ( dwNumReaders == 0 )
        {
           printf( ( "No registered reader was found for the specified(reader group(s) [%s].\n)"), lpmszReaderGroups );
        }
        if ( lpmszReaderNames != NULL)
        {
           lResult = SCFree ( (LPVOID) lpmszReaderNames );
        }    return lResult;
    }
    LONG SCListReaders (IN SCARDCONTEXT hContext,
                        IN LPCTSTR lpmszReaderGroups,
                        OUT LPTSTR * lplpmszReaderNames)
    {
        LONG  lResult;
        DWORD dwReaders;
        assert(lplpmszReaderNames != NULL);
        lResult = SCardListReaders(hContext,
                                   lpmszReaderGroups,
                                   NULL,         // NULL to indicate we want to
                                   &dwReaders);  // know the length of the buffer
        if (lResult != SCARD_S_SUCCESS)
        {
            return lResult;
        }    LPTSTR lpmszReaderNames = (LPTSTR) SCMalloc(dwReaders * sizeof(_TCHAR));    if (lpmszReaderNames == NULL)
        {
            return ERROR_OUTOFMEMORY;
        }    lResult = SCardListReaders(hContext,
                                   lpmszReaderGroups,
                                   lpmszReaderNames,
                                   &dwReaders);
        if (lResult == SCARD_S_SUCCESS)
        {
            //
            // Successful, so return pointer to reader names.
            //
            *lplpmszReaderNames = lpmszReaderNames;
        }
        else
        {
            SCFree((LPVOID) lpmszReaderNames);
        }    return lResult;
    }
    LONG SCFree (IN LPVOID lpMemory)
    {
        LONG lResult;
        assert(lpMemory != NULL);    if (HeapFree(GetProcessHeap(), 0, lpMemory))
        {
            lResult = SCARD_S_SUCCESS;
        }
        else
        {
            lResult = GetLastError();
        }    return lResult;
    }