IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

DLL pour VBA 32bits � DLL pour JAVA 64bits


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre � l'essai
    Homme Profil pro
    D�veloppeur COBOL
    Inscrit en
    F�vrier 2017
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : F�vrier 2017
    Messages : 6
    Par d�faut DLL pour VBA 32bits � DLL pour JAVA 64bits
    Bonjour � la communaut�.

    Suite � de nombreuses recherches infructueuses, je me suis oblig� � poster mon probl�me. C�est la premi�re fois que je fais appel � vous, car je ne trouve aucune solution...

    Je vais essayer de pr�senter mon projet le plus simplement possible...

    J�ai cr�� un code JAVA bas� sur un mod�le math�matique (m�thode de koutrouvelis) permettant d�estimer les param�tres d�une loi alpha stable.
    La m�thode que j�ai ainsi cod�e fait appel � des fonctions provenant d�une DLL.

    Cette DLL, cod�e en c++, �tait initialement utilis�e pour un projet similaire, mais cod� sous Excel/VBA. (D�j� je ne sais pas si cela � une quelconque importance dans l�appel des fonctions... ?)

    PS : Je ne connais strictement rien � c++ ni aux DLL.

    Mon environnement de travail :
    - Windows 10 pro
    - 64bits
    - Logiciel utilis� : Netbeans
    - Compileur : JAVA SE/jdk 1.8
    - Librairie particuli�re utilis�es : JNative / ssj-2.5
    - La DLL est plac�e dans le system32 de Windows

    Et voici les erreurs donner en retour de java :

    run:
    java.lang.UnsatisfiedLinkError: C:\Windows\System32\Stable.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1929)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1847)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1119)
    at launcher.Runner.<clinit>(Runner.java:30)
    Exception in thread "main" Java Result: 1
    BUILD SUCCESSFUL (total time: 0 seconds)
    Le retour montre clairement que l�erreur provient de l�incapacit� � lire la DLL car c�est une 32bits et mon syst�me est en 64.

    Or j�ai cherch� � recompiler cette DLL en c++, mais rien � faire ! cela ne fonctionne pas. (M�me avec des forums d�di�s aux DLL, mes connaissances en c++ ne le permettent simplement pas�)

    Une �me charitable pourrait-elle me conseiller ? me proposer une solution de compilation en 64bits pour cette DLL ? Une autre approche ? Des remarques ?

    Merci � tous !

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Le texte d'explication ne semble pas vraiment correspondre aux sources (mention de .xla inexistant, etc...).
    Peut-�tre des modifications dans la source qui n'ont pas �t� r�percut�es dans la pr�sentation.

    Il s'agit d'une "simple" Dll cod�e en C++, exportant une API C.
    C'est la combinaison/configuration la plus courante des Dll.
    Le VB (.bas) n'est qu'un simple wrapper autour de cette Dll exportant une API C.

    Effectivement, charger un code binaire 32bits dans un processus 64bits, �a le fait pas trop.

    Mais, sauf erreur de ma part, il est tout � fait possible d'avoir un JRE 32bits sur un OS 64bits.

    Donc, charger cette Dll dans un JRE 32bits ne devrait pas poser de probl�me.


    Recompiler le code pour du 64bits est une option. Mais il faut v�rifier que ce code soit "64bits aware", et au vue du code quelque peu archa�que, c'est loin d'�tre �vidant.

    Le code source contient des indices sur le fait qu'il a �t� con�u pour �tre compilable qu'avec VC++.
    Mais le fichier projet ou le fichier solution de Visual Studio n'a pas �t� fourni.

    Il vous faudra donc, soit adapter le code source � votre IDE C++, soit utiliser Visual Studio en cr�ant un projet type Dll et enti�rement le configurer pour faire le travail.
    Pour l'option Visual Studio, c'est pas tr�s complexe mais cela ne s'improvise pas.
    Regardez un tutoriel sur comment faire une Dll en C++ avec Visual Studio exportant un API C.
    C'est pas compliqu� mais faut avoir quelques notions en C et en C++.

    P.S.:
    - La DLL est plac�e dans le system32 de Windows
    Ce n'est pas bien, "system32" n'est pas un d�potoir.
    https://www.chilkatsoft.com/java-loa...ry-windows.asp

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Le code est primitif et ressemble plus � du C qu'� du C++ dans pas mal de cas, mais ne semble pas avoir de conversions entre pointeurs et types entiers, donc il devrait continuer � marcher tant que la taille des tableaux utilis�s tient dans un int 32 bits.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre � l'essai
    Homme Profil pro
    D�veloppeur COBOL
    Inscrit en
    F�vrier 2017
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : F�vrier 2017
    Messages : 6
    Par d�faut
    Merci pour vos r�ponses qui m'aide d�j� � bien comprendre le fonctionnement.

    J'ai effectivement vite compris que la compatibilit� �tait le r�el probl�me.
    Comme j'aimerais savoir si mon code fonctionne je passe pour le moment l'�tape de la recompilation de la librairie.
    Bizarrement je n'avais pas du tout pensais � lancer mon code avec une JRE 32bit.. �a semble pourtant �vident.

    Bacelar :
    Donc, charger cette Dll dans un JRE 32bits ne devrait pas poser de probl�me.
    J'ai donc suivi ton conseil est j'ai installer le jdk1.8.0_121 (version 32bit de java).
    Netbeans semble vouloir lancer mon code sur la Plateforme 32bit et mon programme r�ussi bien a ouvrir le contenue de la DLL.
    C'est donc un grand pas en avant!

    En revanche une autre erreur survient lors de l'appel de la premi�re fonction:

    Erreur:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" java.lang.UnsatisfiedLinkError: launcher.Runner.al(JD)D
    	at launcher.Runner.al(Native Method)
    	at launcher.Runner.Alph(Runner.java:116)
    	at launcher.launcher.main(launcher.java:21)
    C:\Users\Laurent\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 2 seconds)
    D�apr�s ce que j'ai lu sur pas mal de forum, cela pourrait provenir d'une mauvaise d�finition de la fonction dans la DLL, mais comme vous l'avez tous deux mentionn�, VBA comme mon code java ne sont que des wrapper.. cela ne devrais donc pas provenir de l�?!

    Une autre possibilit� et que je fait mal appel � mes fonctions ou � ma dll.. et j'avoue que cette partie reste flou car la DLL s'ouvre!?

    Voici mon proc�d�:
    La class ou je d�fini les fonctions de la librairie:
    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
     
    public class Runner {
     
        public static native double al(long a, double b);
        ...
        ...
     
     
     
        static {
            System.loadLibrary("Stable");
        }
     
       ...
       ... 
     
       public double Alph(double[] x){
           double Var = 0;
           double[] Tab1 = null;
           Tab1 = new double[x.length-1];
           for(int i = 0; i <x.length-1; i++){
               Tab1[i] = x[i+1];            
           } 
           Var = al(x.length,Tab1[0]);    //appel de la fonction (erreur sur l'appel)
           return Var;
        }
    Cela semble t'il correct?


    Ce n'est pas bien, "system32" n'est pas un d�potoir.
    C'est not�. J'ai plac� la DLL dans le bin du jre comme mentionn� dans le tuto.


    M�dinoc:
    il devrait continuer � marcher tant que la taille des tableaux utilis�s tient dans un int 32 bits.
    J'utilise un �chantillon de donn�es de 30 valeurs. La taille du tableau est donc faible pour le moment..

    Merci pour votre aide.

  5. #5
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    L�, c'est un peu le brouillard.
    JNI, c'est tr�s tr�s loin pour moi.

    Je pense qu'on pourra commencer une strat�gie de wrapping pour bien v�rifier le pont entre la Dll C et JNI.

    La strat�gie consiste � faire une simple Dll en utilisant juste les exemples comme :
    http://jmdoudoux.developpez.com/cour...ap-jni.php#jni

    Une fois cette Dll cr��e et utilis�e, vous changez le code de cette Dll pour qu'elle appelle la Dll C initiale.

    J'ai des appr�hensions sur des probl�matiques de convention d'appel entre la Dll C et ce qu'attend JNI (qui �tait, dans mes souvenirs, tr�s psychorigide).

  6. #6
    Membre � l'essai
    Homme Profil pro
    D�veloppeur COBOL
    Inscrit en
    F�vrier 2017
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : F�vrier 2017
    Messages : 6
    Par d�faut
    J'ai suivi votre tuto pour le wrapper.
    - Cr�ation du fichier header en .h avec l'invite de commande et les differents PATH etc..

    La ou �a pause probl�me et lors de la cr�ation du fichier .c. Je suis partie du principe qu'il fallait recompiler la totalit� du code C provenant de Code-Source.com .
    J'ai donc ajout� tous les fichiers d�en t�te et mon header cr�er initialement � un projet C/C++ pour DLL sur netbeans.
    J'ai ajout� les diff�rents path pour les 'includes' (MinGw et le jdk).
    Le probl�me est que l'IDE me montre des erreurs. (cf. fichier pdf en pi�ce-jointe)
    - il ne veut pas prendre en compte le point virgule, le ":" apr�s public ou encore ne veux pas d�finir la variable Lserie..
    et cela dans plusieurs fichiers .h

    messages d'erreur:

    Unexpected token: :

    Unexpected token: ;

    Unable to resolve identifier Lserie.

    D�j� est-ce bien la bonne m�thode que j'utilise pour le JNI, � savoir, faut-il recompiler le code source en totalit� ?

    Merci.
    Images attach�es Images attach�es

Discussions similaires

  1. Dll C++ pour VBA
    Par hadGP dans le forum Visual C++
    R�ponses: 15
    Dernier message: 30/11/2014, 01h56
  2. [D�butant] dll VB.NET pour VBA
    Par issoram dans le forum VB.NET
    R�ponses: 7
    Dernier message: 26/09/2013, 20h42
  3. compiler du vba pour faire une dll (ou equivalent)
    Par emmesse2 dans le forum Macros et VBA Excel
    R�ponses: 7
    Dernier message: 24/11/2008, 10h09
  4. dll C++ pour VBA : erreur 49 et 453
    Par EL0807 dans le forum C++
    R�ponses: 2
    Dernier message: 18/03/2006, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo