Hi,
I found, hope so, good article.
Since the code is too complex for me I'm not able to implement it into Access, i get compile error.
Any help?
QUOTE
The OP is some guy named Ryan Olbe
Using the winscard.dll PC/SC API in Visual Basic 6
Here's some example code I wrote in July of 2008 that shows how a Visual Basic program can interact with a smart card reader using the winscard.dll PC/SC API. Most of the functions contained in winscard.dll I was able to get working except SCardTransmit which would always return ERROR_GEN_FAILURE (0x1F) or SCARD_E_COMM_DATA_LOST (0x8010002F) for some reason and I was never able to figure out why. If there's anyone out there who's interested in writing a VB implementation of the PC/SC API this would probably be a good place to start.
CODE
'**************************************************************************
' winscard.dll Visual Basic Function Prototypes
'**************************************************************************
'SCardAccessStartedEvent
'http://msdn.microsoft.com/en-us/library/aa379466(VS.85).aspx
'HANDLE STDCALL SCardAccessStartedEvent(VOID)
Public Declare Function SCardAccessStartedEvent Lib "winscard.dll" () As Long
'SCardAddReaderToGroup
'http://msdn.microsoft.com/en-us/library/aa379468(VS.85).aspx
'LONG STDCALL SCardAddReaderToGroupA(SCARDCONTEXT(in), LPCSTR(in), LPCSTR(in))
Public Declare Function SCardAddReaderToGroup Lib "winscard.dll" Alias "SCardAddReaderToGroupA" ( _
ByVal hContext As Long, _
ByVal szReaderName As String, _
ByVal szGroupName As String _
) As Long
'SCardBeginTransaction
'http://msdn.microsoft.com/en-us/library/aa379469(VS.85).aspx
'LONG STDCALL SCardBeginTransaction(SCARDHANDLE(in))
Public Declare Function SCardBeginTransaction Lib "winscard.dll" ( _
ByVal hCard As Long _
) As Long
'SCardCancel
'http://msdn.microsoft.com/en-us/library/aa379470(VS.85).aspx
'LONG STDCALL SCardCancel(SCARDCONTEXT(in))
Public Declare Function SCardCancel Lib "winscard.dll" ( _
ByVal hContext As Long _
) As Long
'SCardConnect
'http://msdn.microsoft.com/en-us/library/aa379473(VS.85).aspx
'LONG STDCALL SCardConnectA(SCARDCONTEXT(in), LPCSTR(in), DWORD(in), DWORD(in),
' LPSCARDHANDLE(out), LPDWORD(out))
Public Declare Function SCardConnect Lib "winscard.dll" Alias "SCardConnectA" ( _
ByVal hContext As Long, _
ByVal szReader As String, _
ByVal dwShareMode As Long, _
ByVal dwPreferredProtocols As Long, _
ByRef phCard As Long, _
ByRef pdwActiveProtocol As Long _
) As Long
'SCardControl
'http://msdn.microsoft.com/en-us/library/aa379474(VS.85).aspx
'LONG STDCALL SCardControl(SCARDHANDLE(in), DWORD(in), LPCVOID(in), DWORD(in),
' LPVOID(out), DWORD(in), LPDWORD(out))
Public Declare Function SCardControl Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByVal dwControlCode As Long, _
ByRef lpInBuffer As Long, _
ByVal nInBufferSize As Long, _
ByRef lpOutBuffer As Long, _
ByVal nOutBufferSize As Long, _
ByRef lpBytesReturned As Long _
) As Long
'SCardDisconnect
'http://msdn.microsoft.com/en-us/library/aa379475(VS.85).aspx
'LONG STDCALL SCardDisconnect(SCARDHANDLE(in), DWORD(in))
Public Declare Function SCardDisconnect Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByVal dwDisposition As Long _
) As Long
'SCardEndTransaction
'http://msdn.microsoft.com/en-us/library/aa379477(VS.85).aspx
'LONG STDCALL SCardEndTransaction(SCARDHANDLE(in), DWORD(in))
Public Declare Function SCardEndTransaction Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByVal dwDisposition As Long _
) As Long
'SCardEstablishContext
'http://msdn.microsoft.com/en-us/library/aa379479(VS.85).aspx
'LONG STDCALL SCardEstablishContext(DWORD(in), LPCVOID(in), LPCVOID(in),
' LPSCARDCONTEXT(out))
Public Declare Function SCardEstablishContext Lib "winscard.dll" ( _
ByVal dwScope As Long, _
ByVal pvReserved1 As Long, _
ByVal pvReserved2 As Long, _
ByRef phContext As Long _
) As Long
'SCardForgetCardType
'http://msdn.microsoft.com/en-us/library/aa379482(VS.85).aspx
'LONG STDCALL SCardForgetCardTypeA(SCARDCONTEXT(in), LPCSTR(in))
Public Declare Function SCardForgetCardType Lib "winscard.dll" Alias "SCardForgetCardTypeA" ( _
ByVal hContext As Long, _
ByVal szCardName As String _
) As Long
'SCardForgetReader
'http://msdn.microsoft.com/en-us/library/aa379484(VS.85).aspx
'LONG STDCALL SCardForgetReaderA(SCARDCONTEXT(in), LPCSTR(in))
Public Declare Function SCardForgetReader Lib "winscard.dll" Alias "SCardForgetReaderA" ( _
ByVal hContext As Long, _
ByVal szReaderName As String _
) As Long
'SCardForgetReaderGroup
'http://msdn.microsoft.com/en-us/library/aa379486(VS.85).aspx
'LONG STDCALL SCardForgetReaderGroupA(SCARDCONTEXT(in), LPCSTR(in))
Public Declare Function SCardForgetReaderGroup Lib "winscard.dll" Alias "SCardForgetReaderGroupA" ( _
ByVal hContext As Long, _
ByVal szGroupName As String _
) As Long
'SCardFreeMemory
'http://msdn.microsoft.com/en-us/library/aa379488(VS.85).aspx
'LONG STDCALL SCardFreeMemory(SCARDCONTEXT(in), LPCVOID(in))
Public Declare Function SCardFreeMemory Lib "winscard.dll" ( _
ByVal hContext As Long, _
ByVal pvMem As Long _
) As Long
'SCardGetAttrib
'http://msdn.microsoft.com/en-us/library/aa379559(VS.85).aspx
'LONG STDCALL SCardGetAttrib(SCARDHANDLE(in), DWORD(in), LPBYTE(out), LPDWORD(inout))
Public Declare Function SCardGetAttrib Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByVal dwAttrId As Long, _
ByRef pbAttr As ByteArray, _
ByRef pcbAttrLen As Long _
) As Long
'SCardGetCardTypeProviderName
'http://msdn.microsoft.com/en-us/library/aa379655(VS.85).aspx
'LONG STDCALL SCardGetCardTypeProviderNameA(SCARDCONTEXT(in), LPCSTR(in), DWORD(in),
' LPSTR(out), LPDWORD(inout))
Public Declare Function SCardGetCardTypeProviderName Lib "winscard.dll" Alias "SCardGetCardTypeProviderNameA" ( _
ByVal hContext As Long, _
ByVal szCardName As String, _
ByVal dwProviderId As Long, _
ByVal szProvider As String, _
ByRef pcchProvider As Long _
) As Long
'SCardGetProviderId
'http://msdn.microsoft.com/en-us/library/aa379761(VS.85).aspx
'LONG STDCALL SCardGetProviderIdA(SCARDCONTEXT(in), LPCSTR(in), LPGUID(out))
Public Declare Function SCardGetProviderId Lib "winscard.dll" Alias "SCardGetProviderIdA" ( _
ByVal hContext As Long, _
ByVal szCard As String, _
ByRef pguidProviderId As GUID _
) As Long
'SCardGetStatusChange
'http://msdn.microsoft.com/en-us/library/aa379773(VS.85).aspx
'LONG STDCALL SCardGetStatusChangeA(SCARDCONTEXT(in), DWORD(in),
' LPSCARD_READERSTATEA(inout), DWORD(in))
Public Declare Function SCardGetStatusChange Lib "winscard.dll" Alias "SCardGetStatusChangeA" ( _
ByVal hContext As Long, _
ByVal dwTimeout As Long, _
ByRef rgReaderStates() As SCARD_READERSTATE, _
ByVal cReaders As Long _
) As Long
'SCardIntroduceCardType
'http://msdn.microsoft.com/en-us/library/aa379784(VS.85).aspx
'LONG STDCALL SCardIntroduceCardTypeA(SCARDCONTEXT(in), LPCSTR(in), LPCGUID(in),
' LPCGUID(in), DWORD(in), LPCBYTE(in), LPCBYTE(in), DWORD(in))
Public Declare Function SCardIntroduceCardType Lib "winscard.dll" Alias "SCardIntroduceCardTypeA" ( _
ByVal hContext As Long, _
ByVal szCardName As String, _
ByRef pguidPrimaryProvider As GUID, _
ByRef pguidInterfaces As GUID, _
ByVal dwInterfaceCount As Long, _
ByVal pbAtr As ByteArray, _
ByVal pbAtrMask As ByteArray, _
ByVal cbAtrLen As Long _
) As Long
'SCardIntroduceReader
'http://msdn.microsoft.com/en-us/library/aa379786(VS.85).aspx
'LONG STDCALL SCardIntroduceReaderA(SCARDCONTEXT(in), LPCSTR(in), LPCSTR(in))
Public Declare Function SCardIntroduceReader Lib "winscard.dll" Alias "SCardIntroduceReaderA" ( _
ByVal hContext As Long, _
ByVal szReaderName As String, _
ByVal szDeviceName As String _
) As Long
'SCardIntroduceReaderGroup
'http://msdn.microsoft.com/en-us/library/aa379787(VS.85).aspx
'LONG STDCALL SCardIntroduceReaderGroupA(SCARDCONTEXT(in), LPCSTR(in))
Public Declare Function SCardIntroduceReaderGroup Lib "winscard.dll" Alias "SCardIntroduceReaderGroupA" ( _
ByVal hContext As Long, _
ByVal szGroupName As String _
) As Long
'SCardIsValidContext
'http://msdn.microsoft.com/en-us/library/aa379788(VS.85).aspx
'LONG STDCALL SCardIsValidContext(SCARDCONTEXT(in))
Public Declare Function SCardIsValidContext Lib "winscard.dll" ( _
ByVal hContext As Long _
) As Long
'SCardListCards
'http://msdn.microsoft.com/en-us/library/aa379789(VS.85).aspx
'LONG STDCALL SCardListCardsA(SCARDCONTEXT(in), LPCBYTE(in), LPCGUID(in), DWORD(in),
' LPCSTR(out), LPDWORD(inout))
Public Declare Function SCardListCards Lib "winscard.dll" Alias "SCardListCardsA" ( _
ByVal hContext As Long, _
ByVal pbAtr As ByteArray, _
ByVal rgguidInterfaces As Long, _
ByVal cguidInterfaceCount As Long, _
ByVal mszCards As String, _
ByRef pcchCards As Long _
) As Long
'SCardListInterfaces
'http://msdn.microsoft.com/en-us/library/aa379790(VS.85).aspx
'LONG STDCALL SCardListInterfacesA(SCARDCONTEXT(in), LPCSTR(in), LPGUID(out),
' LPDWORD(inout))
Public Declare Function SCardListInterfaces Lib "winscard.dll" Alias "SCardListInterfacesA" ( _
ByVal hContext As Long, _
ByVal szCard As String, _
ByRef pguidInterfaces As GUID, _
ByRef pcguidInterfaces As Long _
) As Long
'SCardListReaderGroups
'http://msdn.microsoft.com/en-us/library/aa379792(VS.85).aspx
'LONG STDCALL SCardListReaderGroupsA(SCARDCONTEXT(in), LPSTR(out), LPDWORD(inout))
Public Declare Function SCardListReaderGroups Lib "winscard.dll" Alias "SCardListReaderGroupsA" ( _
ByVal hContext As Long, _
ByVal mszGroups As String, _
ByRef pcchGroups As Long _
) As Long
'SCardListReaders
'http://msdn.microsoft.com/en-us/library/aa379793(VS.85).aspx
'LONG STDCALL SCardListReadersA(SCARDCONTEXT(in), LPCSTR(in), LPSTR(out), LPDWORD(inout))
Public Declare Function SCardListReaders Lib "winscard.dll" Alias "SCardListReadersA" ( _
ByVal hContext As Long, _
ByVal mszGroups As String, _
ByVal mszReaders As String, _
ByRef pcchReaders As Long _
) As Long
'SCardLocateCards
'http://msdn.microsoft.com/en-us/library/aa379794(VS.85).aspx
'LONG STDCALL SCardLocateCardsA(SCARDCONTEXT(in), LPCSTR(in),
' LPSCARD_READERSTATEA(inout), DWORD(in))
Public Declare Function SCardLocateCards Lib "winscard.dll" Alias "SCardLocateCardsA" ( _
ByVal hContext As Long, _
ByVal mszCards As String, _
ByRef rgReaderStates() As SCARD_READERSTATE, _
ByVal cReaders As Long _
) As Long
'SCardLocateCardsByATR
'http://msdn.microsoft.com/en-us/library/aa379796(VS.85).aspx
'LONG STDCALL SCardLocateCardsByATRA(SCARDCONTEXT(in), LPSCARD_ATRMASK(in), DWORD(in),
' LPSCARD_READERSTATEA(inout), DWORD(in))
Public Declare Function SCardLocateCardsByATR Lib "winscard.dll" Alias "SCardLocateCardsByATRA" ( _
ByVal hContext As Long, _
ByRef rgAtrMasks() As SCARD_ATRMASK, _
ByVal cAtrs As Long, _
ByRef rgReaderStates() As SCARD_READERSTATE, _
ByVal cReaders As Long _
) As Long
'SCardReconnect
'http://msdn.microsoft.com/en-us/library/aa379797(VS.85).aspx
'LONG STDCALL SCardReconnect(SCARDHANDLE(in), DWORD(in), DWORD(in), DWORD(in),
' LPDWORD(out))
Public Declare Function SCardReconnect Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByVal dwShareMode As Long, _
ByVal dwPreferredProtocols As Long, _
ByVal dwInitialization As Long, _
ByRef pdwActiveProtocol As Long _
) As Long
'SCardReleaseContext
'http://msdn.microsoft.com/en-us/library/aa379798(VS.85).aspx
'LONG STDCALL SCardReleaseContext(SCARDCONTEXT(in))
Public Declare Function SCardReleaseContext Lib "winscard.dll" ( _
ByVal hContext As Long _
) As Long
'SCardReleaseStartedEvent
'http://msdn.microsoft.com/en-us/library/aa379799(VS.85).aspx
'VOID STDCALL SCardReleaseStartedEvent(HANDLE(in))
Public Declare Sub SCardReleaseStartedEvent Lib "winscard.dll" ( _
ByVal hStartedEventHandle As Long _
)
'SCardRemoveReaderFromGroup
'http://msdn.microsoft.com/en-us/library/aa379800(VS.85).aspx
'LONG STDCALL SCardRemoveReaderFromGroupA(SCARDCONTEXT(in), LPCSTR(in), LPCSTR(in))
Public Declare Function SCardRemoveReaderFromGroup Lib "winscard.dll" Alias "SCardRemoveReaderFromGroupA" ( _
ByVal hContext As Long, _
ByVal szReaderName As String, _
ByVal szGroupName As String _
) As Long
'SCardSetAttrib
'http://msdn.microsoft.com/en-us/library/aa379801(VS.85).aspx
'LONG STDCALL SCardSetAttrib(SCARDHANDLE(in), DWORD(in), LPCBYTE(in), DWORD(in))
Public Declare Function SCardSetAttrib Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByVal dwAttrId As Long, _
ByVal pbAttr As ByteArray, _
ByVal cbAttrLen As Long _
) As Long
'SCardSetCardTypeProviderName
'http://msdn.microsoft.com/en-us/library/aa379802(VS.85).aspx
'LONG STDCALL SCardSetCardTypeProviderNameA(SCARDCONTEXT(in), LPCSTR(in), DWORD(in),
' LPCSTR(in))
Public Declare Function SCardSetCardTypeProviderName Lib "winscard.dll" Alias "SCardSetCardTypeProviderNameA" ( _
ByVal hContext As Long, _
ByVal szCardName As String, _
ByVal dwProviderId As Long, _
ByVal szProvider As String _
) As Long
'SCardState
'LONG STDCALL SCardState(SCARDHANDLE(in), LPDWORD(out), LPDWORD(out), LPBYTE(out),
' LPDWORD(out))
Public Declare Function SCardState Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByRef pdwState As Long, _
ByRef pdwProtocol As Long, _
ByRef pbAtr As ByteArray, _
ByRef pcbAtrLen As Long _
) As Long
'SCardStatus
'http://msdn.microsoft.com/en-us/library/aa379803(VS.85).aspx
'LONG STDCALL SCardStatusA(SCARDHANDLE(in), LPSTR(out), LPDWORD(inout), LPDWORD(out),
' LPDWORD(out), LPBYTE(out), LPDWORD(inout))
Public Declare Function SCardStatus Lib "winscard.dll" Alias "SCardStatusA" ( _
ByVal hCard As Long, _
ByVal szReaderName As String, _
ByRef pcchReaderLen As Long, _
ByRef pdwState As Long, _
ByRef pdwProtocol As Long, _
ByRef pbAtr As ByteArray, _
ByRef pcbAtrLen As Long _
) As Long
'SCardTransmit
'http://msdn.microsoft.com/en-us/library/aa379804.aspx
'LONG STDCALL SCardTransmit(SCARDHANDLE(in), LPCSCARD_IO_REQUEST(in), LPCBYTE(in),
' DWORD(in), LPSCARD_IO_REQUEST(inout), LPBYTE(out), LPDWORD(inout))
Public Declare Function SCardTransmit Lib "winscard.dll" ( _
ByVal hCard As Long, _
ByRef pioSendPci As SCARD_IO_REQUEST, _
ByRef pbSendBuffer As Byte, _
ByVal cbSendLength As Long, _
ByRef pioRecvPci As SCARD_IO_REQUEST, _
ByRef pbRecvBuffer As Byte, _
ByRef pcbRecvLength As Long _
) As Long
Public Declare Function SCardTransmitLong Lib "winscard.dll" Alias "SCardTransmit" ( _
ByVal hCard As Long, _
ByRef pioSendPci As SCARD_IO_REQUEST, _
ByRef pbSendBuffer As Byte, _
ByVal cbSendLength As Long, _
ByVal pioRecvPci As Long, _
ByRef pbRecvBuffer As Byte, _
ByRef pcbRecvLength As Long _
) As Long