Bonjour,
j'ai besoin de communiquer avec un lecteur de carte à puce. Pour celà, j'ai besoin de faire appel à winscard.dll. Je travaille en C/C++ sous visual studio.
J'ai pour l'instant un fichier qui contient le main:
un .h et un .cpp qui contiennent ce qu'il faut pour pouvoir appeler la DLL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 // ACR38.cpp : définit le point d'entrée pour l'application console. // #include "stdafx.h" #include <winscard.h> #include "Load_Winscard_DLL.h" #define IOCTL_SMARTCARD_SET_CARD_TYPE SCARD_CTL_CODE(2060) int main() { long rv; long nCardType = 15; // SLE4418 – refer to inf for more info BYTE cbOutBuffer[10]; SCARDCONTEXT hctx; SCARDHANDLE hsc; DWORD dwActiveProtocol; DWORD dwBytesRet; linkDLL(); rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM,NULL,NULL,&hctx); if (rv != SCARD_S_SUCCESS) return rv; unlinkDLL(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 // LoadWinscard.h #ifndef _Load_Winscard_DLL_ #define _Load_Winscard_DLL_ #include <windows.h> #include <winscard.h> /*void Out32(short portaddr, short data); // Ecriture d'une donnée dans le port*/ LONG WINAPI SCardEstablishContext ( DWORD , LPCVOID , LPCVOID , LPSCARDCONTEXT ); /**************************************************************************************** *** Liaison des fonctions à la DLL *** ****************************************************************************************/ int linkDLL(void); /**************************************************************************************** *** Libération *** ****************************************************************************************/ void unlinkDLL(void); #endifJe joins également le prototype de la fonction que je veux appeler dans la DLL (d'après msdn)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 // LoadWinscard.cpp #include "stdafx.h" #include "Load_Winscard_DLL.h" //**** winscard.dll **************************************************************** typedef LONG WINAPI (_stdcall *SCardEstablishContextfuncptr) ( DWORD , LPCVOID , LPCVOID , LPSCARDCONTEXT); SCardEstablishContextfuncptr SCardEstablishContextfp; LONG WINAPI SCardEstablishContext ( DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext){ (SCardEstablishContextfp) ( dwScope, pvReserved1, pvReserved2, phContext); } //*** Linkage des fonctions à la librairie ***************************************** HINSTANCE hLib1; int linkDLL(void) { hLib1 = LoadLibrary(_T("winscard.dll")); if (hLib1 == NULL) { fprintf(stderr,"LoadLibrary Failed.\n"); return -1; } SCardEstablishContextfp = (SCardEstablishContextfuncptr)(hLib1, "SCardEstablishContext"); if (SCardEstablishContextfp == NULL) { fprintf(stderr,"GetProcAddress for SCardEstablishContext Failed.\n"); return -1; } return 0; } void unlinkDLL(void){ FreeLibrary(hLib1); }
J'ai une erreur à la compilation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 LONG WINAPI SCardEstablishContext( __in DWORD dwScope, __in LPCVOID pvReserved1, __in LPCVOID pvReserved2, __out LPSCARDCONTEXT phContext );
qui pointe sur le typedef dans // LoadWinscard.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Erreur 1 error C2059: erreur de syntaxe : '('
J'ai déjà fait appel à des DLL avec succès, mais là je ne vois pas quel est le problème. Des idées?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef LONG WINAPI (_stdcall *SCardEstablishContextfuncptr) ( DWORD , LPCVOID , LPCVOID , LPSCARDCONTEXT);
Merci
Partager