EJEMPLO EN DELFI
Te puedo dar una idea con algo del código en Delphi, para que veas si puedes adaptarlo.
hDLL := LoadLibrary("WINSCARD.DLL")
//En los ejemplos uso varias constantes para mayor claridad, cuyos valores son los siguientes:
Const
MAXIMUM_SMARTCARD_READERS = 10;
SCARD_SCOPE_USER = 0;
SCARD_S_SUCCESS = 0;
Var
RetVar : cardinal;
ReaderList : string;
ReaderListSize : integer;
v : array[0..MAXIMUM_SMARTCARD_READERS] of string;
i : integer;
//Establecer el contexto para un usuario y guardarlo en FContext
RetVar := SCardEstablishContext(SCARD_SCOPE_USER, nil, nil, @FContext)
if RetVar = SCARD_S_SUCCESS then begin
RetVar := SCardListReadersA(FContext, nil, nil, ReaderListSize);
if RetVar = SCARD_S_SUCCESS then begin
SetLength(ReaderList, ReaderListSize);
SCardListReadersA(FContext, nil, Pointer(ReaderList), ReaderListSize);
for i := 0 to MAXIMUM_SMARTCARD_READERS do
if v[i] <> '' then
// Aquí debes almacenar en alguna lista los nombres de los lectores de tarjetas disponibles, que en este caso vienen reportados en la matriz v[]
End;
End;
//Lo que sigue es generalmente manejado en un thread aparte para no bloquear el interfase de usuario, pero puedes hacerlo como tu quieras.
//Hay que consultar el contexto para ver si algo ha cambiado
function CardWatcherThread(PContext: pointer): integer;
var
RetVar : cardinal;
RContext : cardinal;
RStates : array[0..1] of SCARD_READERSTATEA;
begin
try
RContext := cardinal(PContext^);
FillChar(RStates,SizeOf(RStates),#0);
RStates[0].szReader := SelectedReader; //Es un puntero al nombre del lector que hayas seleccionado
RStates[0].pvUserData := nil;
RStates[0].dwEventState := ActReaderState;
while ReaderOpen do
begin
RStates[0].dwCurrentState := RStates[0].dwEventState;
RetVar := SCardGetStatusChangeA(RContext, -1, RStates, 1);
ActReaderState := RStates[0].dwEventState;
PostMessage(NotifyHandle, WM_CARDSTATE, RetVar, 0);
end;
finally
Result := 0;
end;
end;
↧