Problème d'exécution d'une fonction dans un fichier .dll sous java

Fermé
JPrginfo Messages postés 4 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 21 septembre 2020 - Modifié le 21 sept. 2020 à 09:34
JPrginfo Messages postés 4 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 21 septembre 2020 - 21 sept. 2020 à 10:40
Bonjour,

j'essayé de communiquer avec une Carte I/O depuis un programme JAVA par un intermédiaire de fichier Dii.dll
dans ce fichier il y a plusieurs fonctions ce qui m'intéresse est 5 fonctions :
1._DiiGetDevs@4 //avec un argument en paramètre
2._DiiEnumDevs@16 //avec 4 arguments en paramètre les 2 dernier pointeur par Ref
3._DiiOpenDevice@12 //avec 3 arguments en paramètre
4._DiiSetDigitalByte@12
5._DiiSetDigitalBit@12


JNative.setLoggingEnabled(true); //pour voire ce qui ce passe dans la dll.

Pour la premier j'utilise le code suivant :
-------------------------------------------------------
JNative DiiGetDevs = new JNative("Dii","_DiiGetDevs@4");
DiiGetDevs.setRetVal(Type.INT);
DiiGetDevs.setParameter(0,515);
DiiGetDevs.invoke();
return DiiGetDevs.getRetValAsInt();




ca marche bien le retour est 1.
---------------------------------------------------------

pour la deuxième :

Pointer P_id = new Pointer(new HeapMemoryBlock(12));
Pointer P_token = new Pointer(new HeapMemoryBlock(16));

JNative DiiEnumDevs = new JNative("Dii","_DiiEnumDevs@16");
DiiEnumDevs.setRetVal(Type.INT);
DiiEnumDevs.setParameter(0,515);
DiiEnumDevs.setParameter(1,0);
DiiEnumDevs.setParameter(2,P_id);
DiiEnumDevs.setParameter(3,P_token);
DiiEnumDevs.invoke();


return DiiEnumDevs.getRetValAsInt();

ca marche le retour est 1 mais un message dans la console :
[DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Using cached handle 1879965696 for function '_DiiEnumDevs@16' in library 'Dii'

-------------------------------------------------------------------------------------------------------
pour la troisième :

JNative DiiOpenDevs = new JNative("Dii","_DiiOpenDevice@12");
DiiOpenDevs .setRetVal(Type.INT);
DiiOpenDevs .setParameter(0, P_token);//le pointeur dans la 2 em fonction
DiiOpenDevs .setParameter(1, 515);
DiiOpenDevs .setParameter(2, "true")// ce parametre est boolean dans la fonction dll mais au import de org.xvolks.jnative setParameter n'a pas d'argument boolean c pour ca je fais true en string et aussi "1" en enitier.
DiiOpenDevs.invoke();
retunr DiiOpenDevs.getRetValAsInt();

ca marche pas le retour est -1 avec le même debug que la deuxième fonction.

est ce que quelqu'un a une piste que je peut suivre cachant qu'avec le code VB que le fournisseur de la carte a fournit ca marche très bien.
voici le lien du fournisseur vous pouvez trouvez le code en VB et VC.

https://www.smatlab.com/code/code10.html

https://www.smatlab.com/

Merci pour votre aide








Configuration: Windows / Chrome 85.0.4183.102
A voir également:

2 réponses

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 21 sept. 2020 à 10:34
Bonjour,

Je ne connais pas JNative, mais un truc qui me paraît très suspect, c'est le booléen transmis comme chaîne de caractère... Tu es sûr de ton coup ? Tu as un exemple où ça marche ?

Sinon, pour le message de debug, je ne m'inquièterais pas outre mesure. Il ne dit pas qu'il y a un problème, il donne juste une information que le développeur pourrait juger utile, à savoir que comme il a déjà chargé cette dll, il réutilise un pointeur précédemment établi, c'est tout.

Xavier
0
JPrginfo Messages postés 4 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 21 septembre 2020
21 sept. 2020 à 10:40
merci pour votre réponse,

justement je sais mais la biblio de org.xvolks.jnative n'a pas d'argument boolean sauf INT,String,VOID,Long alors je fait "true" en String at aussi 1 en int.

mais le debug a lieu avant ca ,c dans la deuxième fonction.
0