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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 395
    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 395
    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 ?

+ 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