Dear knowledgeable ones.
I started on a project to be able to use a smart card and a smart card reader in order to limit access to a program.
I had some sample code written in Visual Basic, and wanted to translate this to Delphi instead, something I think I have done pretty well.
At the moment, I get my program up and running. It compiles with no error... BUT...
Whenever I try to access external functions I have problems with the parameters.
I wonder if somebody maybe have a good explanation on how to be able to use the functions in the "SCardSyn.DLL"
It seems like Delphi and Visual Basic handles transfer of parameters quite differently.
My code for a few functions is as follows:
{Establish a context to resource manager
Parameters:
dwScope = Scope (see Scopes)
pvReserved1 = Reserved for further use
pvReserved2 = Reserved for further use
phContext = Pointer to Context}
FUNCTION SCardEstablishContext(dwScope, pvReserved1, pvReserved2:LONGWORD; phContext:PCHAR):LONGWORD; stdcall; external 'WINSCARD';
That actually works, where as my direct translation of Visual Basic code
*** Visual Basic code START***
' Establish a context to resource manager
' Parameters:
' dwScope = Scope (see Scopes)
' pvReserved1 = Reserved for further use
' pvReserved2 = Reserved for further use
' phContext = Pointer to Context
'
Public Declare Function SCardEstablishContext Lib "WINSCARD" _
(ByVal dwScope As Long, _
ByVal pvReserved1 As Long, _
ByVal pvReserved2 As Long, _
ByRef phContext As Long) As Long
*** Visual Basic code END ***
*** Delphi equivalent? code START ***
FUNCTION SCardEstablishContext(dwScope, pvReserved1, pvReserved2:LONGWORD; VAR phContext:LONGWORD):LONGWORD; stdcall; external 'WINSCARD';
*** Delphi equivalent? code END ***
Does not work at all
There are many functions in both the WINSCARD and SCARDSYN dynamic link library and many of which I have great problems with in regards to my Visual Basic to Delphi Parameter translation.
I suppose I am on the right track when I try to use pointers to parameters that need to go both ways, but I still experience many problems.
I would greatly appreciate any help and explanation in regards to the use of PCHAR
Also if there are any "simple" way of doing this. I thought this would be simple, but apparently not as simple as I thought. lol.
The functions I have tried to do so far is:
FUNCTION SCardEstablishContext(dwScope, pvReserved1, pvReserved2:LONGWORD; phContext:PCHAR):LONGWORD; stdcall; external 'WINSCARD';
FUNCTION SCardReleaseContext(hContext:LONGWORD):LONGWORD; stdcall; external 'WINSCARD';
FUNCTION SCardListReadersA(hContext:LONGWORD; mszGroups:BYTE; mszReaders, pcchReaders:PCHAR):LONGWORD; stdcall; external 'WINSCARD';
FUNCTION SCardConnectA(hContext:LONGWORD; szReader:STRING; dwShareMode, dwPreferredProtocols:LONGWORD; hCard, dwActiveProtocol:PCHAR):LONGWORD; stdcall; external 'WINSCARD';
FUNCTION SCardDisconnect(hCard,dwDisposition:LONGWORD):LONGWORD; stdcall; external 'WINSCARD';
FUNCTION SCardI2CInit(hCard:LONGWORD; VAR pCardParameters:LONGWORD; lType:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCardI2CReadData(hCard:LONGWORD; VAR pbReadBuffer:BYTE; ulReadBufferSize,ulAddress,ulBytesToRead:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCardI2CWriteData(hCard:LONGWORD; VAR pbWriteBuffer:BYTE; ulWriteBufferSize, ulAddress, ulBytesToWrite:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPReadData(hCard, ulBytesToRead:LONGWORD; VAR pbData:BYTE; ulAddress:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPReadProtectionMemory(hCard,ulDataLen:LONGWORD; VAR pbData:BYTE):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPWriteData(hCard,ulDataLen:LONGWORD; VAR pbData:BYTE; ulAddress:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPCompareAndProtect(hCard:LONGWORD; VAR bData:BYTE; ulAddress:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPPresentPIN(hCard,ulPINLen:LONGWORD; VAR pbPIN:BYTE):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPChangePIN(hCard,ulOldPINLen:LONGWORD; VAR pbOldPIN:BYTE; ulNewPINLen:LONGWORD; VAR pbNewPIN:BYTE):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard2WBPIsPinPresented(hCard:LONGWORD; VAR pfPinPresented:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPReadData(hCard, ulBytesToRead:LONGWORD; VAR pbData:BYTE; ulAddress:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPVerifyProtectBit(hCard, ulAddress:LONGWORD; VAR pfProtected:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPWriteData(hCard, ulDataLen:LONGWORD; VAR pbData:BYTE; ulAddress, fProtect:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPCompareAndProtect(hCard:LONGWORD; VAR bData:BYTE; ulAddress:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPPresentPIN(hCard, ulPINLen:LONGWORD; VAR pbPIN:BYTE):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPChangePIN(hCard, ulOldPINLen:LONGWORD; VAR pbOldPIN:BYTE; ulNewPINLen:LONGWORD; VAR pbNewPIN:BYTE):LONGWORD; stdcall; external 'scardsyn';
FUNCTION SCard3WBPIsPinPresented(hCard:LONGWORD; VAR pfPinPresented:LONGWORD):LONGWORD; stdcall; external 'scardsyn';
I really need somebody to enlighten me a bit as in how to make the parameters work properly.
Many thanks in advance,
Morten Brendefur.