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

Signaler
Messages postés
4
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
21 septembre 2020
-
Messages postés
4
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
21 septembre 2020
-
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

2 réponses

Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
993
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
Messages postés
4
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
21 septembre 2020

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.