Se connecter / S'enregistrer
Votre question

[C/JAVA] Problème avec la fonction SCardTransmit

Tags :
  • Dll
  • Programmation
Dernière réponse : dans Programmation
10 Septembre 2009 11:26:08

Bonjour,

je souhaite développer un logiciel Windows qui permettra de communiquer avec les cartes SIM, via des commandes APDU.
Je voudrais le faire en Java, mais en appelant les fonctions de winscard.dll via la Java Native Interface (j'ai fait le choix de rester en Java malgré cette difficulté).

J'ai implémenté les fonctions SCardEstablishContext, SCardConnectW, SCardStatus, SCardReleaseContext, SCardDisconnect via cette technique, et elles fonctionnent toutes.
Je détaille ma manière de procéder pour pouvoir vous dire à quelle étape j'ai un problème :

But : Créer une dll JNI que Java pourra appeler, qui va elle-même communiquer avec la dll native Winscard.dll.

1) Je crée un fichier .java dans lequel je déclare les méthodes de la dll. Je compile. (Dans cette classe il y a aussi System.loadLibrary("MaDllJni") )

2) Je génère le header en utilisant une instruction jni à partir du fichier .class créé en 1).

3) Je crée un .c qui implémente les méthodes que l'on veut avec des macros JNI (JNI EXPORT etc...). Compilation, on a un fichier.o

4) On crée un fichier .def avec la commande dlltool -k MaDllJni.o -z MaDllJni.def . J'enlève les alias du fichier (c'est écrit en suivant ce tutorial : http://johannes-fetz.blogspot.com/2009/07/debuter-avec-...).

5) Je crée la dll avec gcc -shared -o MaDllJni.dll -I"C:\Program Files\Java\jdk1.6.0_16\include" -I"C:\Program Files\Java\jdk1.6.0_16\include\win32" MaDllJni.def MaDllJni.o

6) Ensuite je crée un fichier .java contenant une méthode main, et je lance tout sous Eclipse.


Cela marche avec quasiment toutes les méthodes, sauf une, et la plus importante... : SCardtransmit, qui permet d'envoyer les commandes APDU à la carte...
Le problème se situe au niveau du second argument (du type SCARD_IO_REQUEST). L'aide Windows conseille de mettre SCARD_PCI_T0. Cependant un problème se produit lors de l'étape 5 avec un "undefined reference to 'SCARD_PCI_T0'" alors que tout est censé être déclaré dans winscard.h ...
Plus précisemment le problème semble être lié à g_rgSCardT0Pci (élément figurant dans la winscard.dll après l'avoir parcourue...) et qui participe à la définition de SCARD_PCI_T0.

Ca fait plusieurs jours que je cherche une solution, mais je rame complètement.

Pour info je développe sous windows avec les compilateurs de MinGw dernière version.
Désolé d'avance si mes propos sont confus, mais je suis loin d'être un pro en programmation..

Avez-vous des idées ?

Merci

Autres pages sur : java probleme fonction scardtransmit

a b L Programmation
10 Septembre 2009 23:07:31

Oui, en fait c'est une ressource externe.
Elle est définie dans winscard.dll (tu peux voir son adresse avec Dependency). Donc:
- soit tu lies ton projet avec le .lib (si tu l'as).
- soit tu exportes le .def de la dll et tu utilises __declspec(dllimport)
- soit tu ne t'embêtes pas, et tu charges la DLL à la main (LoadDLL) et tu va récupérer la valeur avec un GetProcAddress (retourne un pointeur sur la structure)
- soit tu mets directement une valeur au feeling. Pour cette valeur, j'ai 1 pour le protocole (T=0) et 8 pour la longueur, mais comme ça pourrait changer (même si je n'y crois pas), mieux vaut récupérer l'info dans la dll. ;) 

Projet intéressant, mais bon courage pour implémenter les normes GSM. :) 
m
0
l
11 Septembre 2009 09:14:12

Merci beaucoup pour ton aide, je mets ça en oeuvre et je te tiens au courant.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS