Compartir a través de


Función SCardLocateCardsA (winscard.h)

La función SCardLocateCards busca en los lectores enumerados en el parámetro rgReaderStates una tarjeta con una cadena ATR que coincida con uno de los nombres de tarjeta especificados en mszCards, devolviendo inmediatamente con el resultado.

Sintaxis

LONG SCardLocateCardsA(
  [in]      SCARDCONTEXT         hContext,
  [in]      LPCSTR               mszCards,
  [in, out] LPSCARD_READERSTATEA rgReaderStates,
  [in]      DWORD                cReaders
);

Parámetros

[in] hContext

Identificador que identifica el contexto del administrador de recursos. El contexto del administrador de recursos se establece mediante una llamada anterior a SCardEstablishContext.

[in] mszCards

Cadena múltiple que contiene los nombres de las tarjetas que se van a buscar.

[in, out] rgReaderStates

Matriz de estructuras de SCARD_READERSTATE que, en la entrada, especifican los lectores que se van a buscar y que, en la salida, recibe el resultado.

[in] cReaders

Número de elementos de la matriz rgReaderStates .

Valor devuelto

Esta función devuelve valores diferentes en función de si se realiza correctamente o no.

Código devuelto Descripción
Success
SCARD_S_SUCCESS.
Error
Código de error. Para obtener más información, consulte Valores devueltos de tarjeta inteligente.

Comentarios

Este servicio es especialmente útil cuando se usa junto con SCardGetStatusChange. Si no se encuentra ninguna tarjeta coincidente mediante SCardLocateCards, la aplicación que realiza la llamada puede usar SCardGetStatusChange para esperar los cambios de disponibilidad de la tarjeta.

La función SCardLocateCards es una función de seguimiento de tarjetas inteligentes . Para obtener más información sobre otras funciones de seguimiento, consulte Funciones de seguimiento de tarjetas inteligentes.

Llamar a esta función debe realizarse fuera de una transacción. Si una aplicación inicia una transacción con la función SCardBeginTransaction y, a continuación, llama a esta función, restablece el parámetro hCard (de tipo SCARDHANDLE) de la función SCardBeginTransaction .

Windows Server 2008 R2 y Windows 7: Llamar a esta función dentro de una transacción podría provocar que el equipo deje de responder.

Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: No aplicable.

Ejemplos

En el ejemplo siguiente se muestra la búsqueda de tarjetas inteligentes.

// Copyright (C) Microsoft. All rights reserved. 
#include <stdio.h>
#include <winscard.h>
#include <tchar.h>
#pragma comment(lib, "winscard.lib")

HRESULT __cdecl main()
{
HRESULT           hr = S_OK;
LPTSTR            szReaders, szRdr;
DWORD             cchReaders = SCARD_AUTOALLOCATE;
DWORD             dwI, dwRdrCount;
SCARD_READERSTATE rgscState[MAXIMUM_SMARTCARD_READERS];
TCHAR             szCard[MAX_PATH];
SCARDCONTEXT      hSC;
LONG              lReturn;

// Establish the card to watch for.
// Multiple cards can be looked for, but
// this sample looks for only one card.
_tcscat_s ( szCard, MAX_PATH * sizeof(TCHAR), TEXT("GemSAFE"));
szCard[lstrlen(szCard) + 1] = 0;  // Double trailing zero.

// Establish a context.
lReturn = SCardEstablishContext(SCARD_SCOPE_USER,
                                NULL,
                                NULL,
                                &hSC );
if ( SCARD_S_SUCCESS != lReturn )
{
    printf("Failed SCardEstablishContext\n");
    exit(1);
}

// Determine which readers are available.
lReturn = SCardListReaders(hSC,
                           NULL,
                           (LPTSTR)&szReaders,
                           &cchReaders );
if ( SCARD_S_SUCCESS != lReturn )
{
    printf("Failed SCardListReaders\n");
    exit(1);
}
// Place the readers into the state array.
szRdr = szReaders;
for ( dwI = 0; dwI < MAXIMUM_SMARTCARD_READERS; dwI++ )
{
    if ( 0 == *szRdr )
        break;
    rgscState[dwI].szReader = szRdr;
    rgscState[dwI].dwCurrentState = SCARD_STATE_UNAWARE;
    szRdr += lstrlen(szRdr) + 1;
}
dwRdrCount = dwI;

// If any readers are available, proceed.
if ( 0 != dwRdrCount )
{
  for (;;)
  { 
    // Look for the card.
    lReturn = SCardLocateCards(hSC,
                               szCard,
                               rgscState,
                               dwRdrCount );
    if ( SCARD_S_SUCCESS != lReturn )
    {
        printf("Failed SCardLocateCards\n");
        exit(1);
    }

    // Look through the array of readers.
    for ( dwI=0; dwI < dwRdrCount; dwI++)
    {
        if ( 0 != ( SCARD_STATE_ATRMATCH & 
                    rgscState[dwI].dwEventState))
        {
           _tprintf( TEXT("Card '%s' found in reader '%s'.\n"),
                     szCard,
                     rgscState[dwI].szReader );
            SCardFreeMemory( hSC,
                             szReaders );
            return 0;  // Context will be release automatically.
        }
        // Update the state.
        rgscState[dwI].dwCurrentState = rgscState[dwI].dwEventState;
    }

  // Card not found yet; wait until there is a change.
  lReturn = SCardGetStatusChange(hSC,
                                 INFINITE, // infinite wait
                                 rgscState,
                                 dwRdrCount );
  if ( SCARD_S_SUCCESS != lReturn )
  {
    printf("Failed SCardGetStatusChange\n");
    exit(1);
  }
 }  // for (;;)
}
else
    printf("No readers available\n");

// Release the context.
lReturn = SCardReleaseContext(hSC);
if ( SCARD_S_SUCCESS != lReturn )
{
    printf("Failed SCardReleaseContext\n");
    exit(1);
}

SCardFreeMemory( hSC,
                 szReaders );

return hr;
}

Nota

El encabezado winscard.h define SCardLocateCards como un alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutro de codificación con código que no es neutral de codificación puede provocar discrepancias que dan lugar a errores de compilación o en tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winscard.h
Library Winscard.lib
Archivo DLL Winscard.dll

Consulte también

SCARD_READERSTATE

SCardCancel

SCardEstablishContext

SCardGetStatusChange