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 :

Excel Wrapper XLW + XLL + <math.h> fonctionne pas


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut Excel Wrapper XLW + XLL + <math.h> fonctionne pas
    Bonjour

    J’essaye de créer une solution sous Visual Studio 2003 qui crée un XLL pouvant etre utilisé sous Excel.
    Pour cela, j’utilise XLW (wrapper C++) que j’ai trouvé sur le net (http://xlw.sourceforge.net).
    Si je compile la version 1.2.2 tout fonctionne parfaitement.
    Je prends donc le projet du zip ecrit en Visual 6. VS2003 me le convertit en solution et tout fonctionne très bien à la compilation.
    Cette solution contient deux sous-projets :
    XLW qui est le wrapper
    Xlwexample qui est l’exemple d’utilisation (subtil hein.. !)

    Dans ce dernier on a ce genre de code (xlwExample.cpp)
    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
     
    extern "C"
    {
     
     
      LPXLOPER EXCEL_EXPORT xlCirc(XlfOper xlDiam)
      {
        EXCEL_BEGIN;
        // Converts d to a double.
        double ret=xlDiam.AsDouble();
        // Multiplies it.
        ret *= 3.14159;
        // Returns the result as a XlfOper.
        return XlfOper(ret);
        EXCEL_END;
      }
    }
    Je rajoute donc un projet (j’arrive au problème…) qui servira à fournir les fonctions de calcul dont par exemple ce fichier
    (test.h)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double f1(double x)
    {
    return (x*x-1) ;
    }
    Dans le fichier xlwexample.cpp je rajoute donc la ligne suivante avant la ligne extern « c »

    Tout fonctionne parfaitement lorsque je lance Excel et le XLL, il me calcule bien la circonférence.

    Si maintenant je transforme mon fichier test.h en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <math.h>
    double f1(double x)
    {
    return (x*x-1) ;
    }
     
    double f2(double x)
    {
    	return exp(x);
    }
    Et que je transforme le fichier xlwExample.cpp en
    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
     
    extern "C"
    {
     
     
      LPXLOPER EXCEL_EXPORT xlCirc(XlfOper xlDiam)
      {
        EXCEL_BEGIN;
        // Converts d to a double.
        double ret=xlDiam.AsDouble();
        // Multiplies it.
        //ret *= 3.14159;
        ret = f2(4);  /////////////!!!!!!!!!! C’est ici qu’est le changement !!!!!!!!!!!!///
        // Returns the result as a XlfOper.
        return XlfOper(ret);
        EXCEL_END;
      }
    }
    A la compilation tout fonctionne bien, par contre à l’execution rien ne fonctionne. Il me dit que le fichier XLL n’est pas un Add-in Valide => ca marche pas…
    J’avoue que j’ai un peu du mal à comprendre …

    Si qqun sait m’aider ?
    Merci
    DH

    PS : désolé pour la longue tartine :-)

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Au début j'avais l'impression que ca provenait du fait que je rajoute du C++, mais si si je rajoute la classe suivante (ô combien subtile)dans le fichier test.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Prout
    {
    public:
    	double a_;
    	double b_;
     
    	Prout(double a, double b):a_(a),b_(b){};
    	double a(){return a_;};
    	double b(){return b_;};
    	double test(double x) {return (a()*x + b());};
    };
    et la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double f2(double x)
    {
    	Prout p(2.0,3.0);
    	return (p.test(x));
    }
    ca fonctionne
    => viendrait-ce de <math.h> ou bien de l'appel extern "c"??? (d'ailleurs si qqun veut bien m'expliquer à quoi ca sert (extern c), je suis aussi preneur.. ;-)
    Tks
    DH

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    En fait après avoir fait qqs recherches, ca semblerait venir de la déclaration extern "C". Mais je ne vois vraiment pas pq, ni comment faire...??

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Le
    extern "C" { }
    dit qur pourla décoration des noms de fonction, on va utiliser la version C au lieu de la C++. C'est à dire que la fonction
    double f2(double x)
    s'appelera _f2 au lieu de quelque chose du genre _f2@8. C'est nécessaire pour Excel puisse voir tes fonctions (en particulier le xlAutoOpen qui en fait une xll).

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Oui mais alors pq je ne sais pas utiliser de fonctions mathematiques alors..??
    On sait quand meme programmer une exponentielle en C...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Citation Envoyé par Ulmo
    Le dit qur pour la décoration des noms de fonction, on va utiliser la version C au lieu de la C++.
    Oui.
    C'est à dire que la fonction
    double f2(double x)
    s'appelera _f2 au lieu de quelque chose du genre _f2@8. C'est nécessaire pour Excel puisse voir tes fonctions (en particulier le xlAutoOpen qui en fait une xll).
    Perdu, la fonction s'appellera _f2, _f2@8 ou @f2@8 au lieu de ?f2@@YANN@Z sous Visual (ou un autre nom C++ sous Borland ou encore un autre sous gcc)

    Edit: Je n'ai pas exploré les .obj pour avoir l'erreur, j'ai juste tenté de compiler un programme qui utilisait une telle fonction sans la définir -> Les erreurs de linkage de Visual sont assez détaillées...
    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.

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par Médinoc
    Oui.

    Perdu, la fonction s'appellera _f2, _f2@8 ou @f2@8 au lieu de ?f2@@YANN@Z sous Visual (ou un autre nom C++ sous Borland ou encore un autre sous gcc)
    J'ai donné des noms à moitié au pif, en me rendant bien compte qu'il n'y avait pas d'indication de type dans mon exemple C++. Mais je n'aurais pas pu trouver le nom exact. Il faut explorer les .obj pour ça ?
    Citation Envoyé par dhoorens
    Oui mais alors pq je ne sais pas utiliser de fonctions mathematiques alors..??
    On sait quand meme programmer une exponentielle en C...
    Bien sûr que tu peux.

    Citation Envoyé par dhoorens
    Dans le fichier xlwexample.cpp je rajoute donc la ligne suivante avant la ligne extern « c »
    Et si tu le mets après ?

  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Citation Envoyé par Ulmo
    Et si tu le mets après ?
    J'ai essayé. Ca ne marche pas.
    En fait j'ai (presque) tout essayé:
    • le #include "Test.h" après le extern "C"
    • le #include "Test.h" avant le extern "C"
    • pas de extern "C" (on ne sait jamais :-)
    • la déclaration de la fonction f2 à l'intérieur du extern "C"
    • la déclaration à l'exterieur du extern "C"
    • l'utilisation de <math.h> au lieu de <cmath>

    Quand on ne sait pas d'où vient l'erreur, on teste tout ce qu'on peut...

    En fait lorsque je Debug en lancant Excel, il m'ouvre le fichier XLL en me disant que ce n'est pas un fichier Xll valide, puis il m'ouvre mon fichier excel (qui appelle les fonctions du Xll) dans lequel j'ai (évidemment) des erreurs lorsque j'appelle les formules...

    Voili voila

    Est ce que qqun à déjà utilisé ce XLW pour créer des DLL avec des fonctions math?
    Tks
    DH
    pas de extern "C" (on sait jamais :-) )

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Voici un exemple de l'utilisation de extern "C".
    En plus de montrer les différents cas possibles, il montre que si une fonction est déclarée ou non extern "C", elle doit être définie pareil :
    http://www.developpez.net/forums/sho...d.php?t=256281
    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.

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Merci bcp
    Mais cependant ca ne fonctionne tjs pas

  11. #11
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    JE sais que ca fait un peu "je trouve pas ce que je cherche, donc je vais à la concurrence", mais est ce que qqun pourrait m'indiquer un forum du meme style que celui-ci où je pourrais poser cette question.. (meme en anglais)
    Merci

    PS: ca ne doit pas vous emepcher de toujours réflechir à mon problème hein... !!!

  12. #12
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Personellement je n'ai pas trouvé mieux qu'ici. Par exemple tu y trouveras plein de gens pour t'expliquer qu'on ne met pas de définition de fonction dans un header...

    Ca marche très bien comme ça :
    test.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "test.h"
    #include <math.h>
     
    double f1(double x) {
        return (x*x-1);
    }
     
    double f2(double x) {
        return exp(x);
    }
    test.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double f1(double);
    double f2(double);
    xlwExample.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    extern "C"
    {
        #include "test.h"
     
      LPXLOPER EXCEL_EXPORT xlCirc(XlfOper xlDiam)
    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Webbrowser Excel Wrapper
    Par moctey dans le forum C#
    Réponses: 0
    Dernier message: 19/08/2009, 16h42
  2. math.h ne fonctionne pas - windows
    Par forumcpp_nono dans le forum C++
    Réponses: 5
    Dernier message: 01/05/2009, 13h25
  3. Fonction Excel : ne fonctionne pas
    Par jojodoudou dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/09/2006, 15h44
  4. [VBA-Excel] Tri de listview ne fonctionne pas avec des nombres à virgule
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/09/2006, 15h32
  5. [vb6][activeX][excel] l'activeX ne fonctionne pas
    Par totof39 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/01/2006, 12h32

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