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

Langage C++ Discussion :

Problème de données statiques dans un DLL (Excel)


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut Problème de données statiques dans un DLL (Excel)
    Bonjour,

    un nouveau probleme sur lequel je ne trouve pas de solution sur internet et j'aimerai vos avis:

    le problème est très simple, j'ai une classe (disons Object) qui possede comme membre statique une liste de dates, de telle sorte que chaque fois qu'une classe est instantié avec son constructeur qui prend comme input une date, cette date va dans la liste statique.

    Le gros probleme de faire ça est dans la pratique, car comme ma DLL est utilisé dans Excel, je me suis rendu compte que la liste de dates ne se réinitialise pas tant que je ne ferme pas la feuille Excel, et donc si j'ai plusieurs utilisations de cette fonction dans la feuille, il se peut que ma liste soit completement fausse car les dates ne s'effacent pas.

    Pouvez-vous me donner des pistes sur un moyen d'éviter d'utliser un membre statique, peut-etre en creant une classe ObjectHelper juste pour garder cette liste et que mes classes Object pointe a cette classe?

    merci bien!!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    J'ai vraiment l'impression d'être dans un cas de "XY Problem".
    Franchement une variable statique pour "stocker" les valeurs d'un paramètre d'un constructeur, c'est tellement hors de propos que le "problème" Dll Excel, c'est vraiment pas trop le soucis.
    Si un instance de votre "Object" est une variable globale, comment vous êtes sûr que votre liste statique est déjà correctement initialisée avant que le constructeur de la variable soit appelé ?
    => On tombe sur le problème du "Static Initialization Order Fiasco" :
    https://en.cppreference.com/w/cpp/language/siof

    En plus, il semble que dans votre logique, à un moment donné, vous voulez que votre liste statique "se réinitialise". Mais en fonction de quoi ???
    Il n'y a rien dans le langage C++ pour "réinitialise" une variable statique, à moins de coder explicitement cela (bonjour la thread-safeness de ce genre de machin).

    En résumé, c'est quoi votre vrai problème initial ?


    P.S.: Il existe beaucoup de solution pour décharger du code dynamiquement sous Excel, si on utilise les "bonnes" technologies.
    En COM, implémentation de la fonction DllCanUnloadNow
    En .NET, déchargement d'AppDomain
    etc...?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    bacelar, merci pour ton retour d'experience.

    Alors, dans mon cas, pas de .NET, pas de.COM, juste une librairie C++ avec laquelle on interagit dans XL en produisant une XLL "classique".

    En fait, je t'explique le contexte un peu: imagine ma librairie c'est un moteur MonteCarlo pour calculer des intégrales mathématiques. Cette fameuse classe est un objet mathématique qui est créé avec une date, de telle sorte que l'intégrale se calcule avec tout les objets de ce type.

    Pour se faire, il me faut la liste de toutes les dates, donc j'avais créé cette liste statique qui est je le conçois maintenant une trés mauvaise idée, car on va pouvoir appeler le code sur différentes intégrales, et donc avec des listes de dates plus ou moins grandes. Il me faut garder cettte liste dans un objet qui s'initialise a chaque appel d'une fonction de la lib, donc surement une classe séparée pour garder les dates, non?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Designer une API "C" pour qu'elle soit inutilisable depuis un programme hôte, comme Excel, c'est pas très difficile, vous venez dans faire une, GG.

    Vous devriez concevoir une API utilisable à partir de l'hôte, ici Excel, grâce aux langages de programmation compris dedans, VBA ou langages .NET.

    Vous vous en servez déjà pour appeler votre API "C" bancale, mais dans votre API, il n'y a rien pour "reseter" votre environnement de calcul.
    Vous n'avez pas eu ce besoin car le code "embarqué" dans l'hôte ne semblait pas en avoir besoin, mais c'est une erreur. Et l'erreur, elle n'est pas dans votre API/code "C" mais dans le code embarqué.

    Si vous avez besoin d'une liste de date par "intégrale" et que vous gérer chaque intégrale dans le code embarqué, qu'est-ce qui vous empêche de créer une fonction "CreationDuneListeDeDateALaCon" dans votre Dll qui vous renvoie un HANDLE et que vous utiliserez comme argument supplémentaire aux fonctions qui ont besoin d'interagir avec cette liste de date ?

    Coté "C", on caste l'HANDLE en un pointeur sur votre type liste de date (qui n'a aucunement besoin d'être statique) pour faire toutes les bidouilles que vous voulez.

    Clairement, en utilisant COM ou .NET, vous aurez un code "embarqué" bien plus lisible et type safe, mais bon, c'est vous qui voyez.
    Et la gestion de la mémoire, c'est à vous de la rendre correcte car vous ne bénéficiez pas des compteurs de référence implémentés par ces 2 technologies.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    hehe... je suis pas du tout developpeur, plutot un contribuant a une librairie conçue par des ITs et moi j'essaye de faire mes devs dedans. Ce n'est pas un projet personnel ou je fais ce que je veux en fait.

    On travaille avec l'interface xlw comme beaucoup de gens qui veulent juste exposer leur librairie a Excel, mais c'est peut-etre une grosse erreur je suis pas assez expert pour argumenter des pour et des contres.

    Ceci dit, je vais voir si je peux simplement avoir une classe helper qui conserve les dates au fur et a mesure, et que mes autres classes pointe a cette Helper, ça semble presque évident comme ça et on évite le static qui fait mal

    merci.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    interface xlw
    Si c'est https://xlw.github.io/, ça m'a leur pas mal du tout.
    Je connaissais pas, Mais je pense fortement que c'est basé sur du COM.
    Vous devriez voir les symboles exportés par votre Dll et je pense que "DllCanUnloadNow" en fait partie.

    Vous devriez concevoir votre code coté embarqué dans Excel (VBA) pour qu'il corresponde à votre besoin dans Excel, puis vous implémentez l'API nécessaire avec XLW.

    Vous ne serez jamais bloqué par une impossibilité d'implémenter l'API en C/C++ mais c'est plutôt l'inverse : faire un truc en C/C++ inutilisable correctement en VBA.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Oui c'est bien cette interfaçe et ça marche très très bien dans la pratique.

    Mais en fait meme si on a acces a la fonction de Unload, on ne veut pas faire ça car la plupart des objets que l'on load, on veut les garder pour d'autres opérations.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Citation Envoyé par micamused Voir le message
    Mais en fait meme si on a acces a la fonction de Unload, on ne veut pas faire ça car la plupart des objets que l'on load, on veut les garder pour d'autres opérations.
    Je comprends tout à fait, c'était juste pour confirmer l'utilisation de COM.

    Ce que je vous conseille, c'est de faire votre code VBA en premier, donc en gérant les cycles de vies des objets dans le VBA, et d'implémenter ensuite l'API C avec "XLW".
    Ainsi, si votre code VBA a vraiment besoin de statics, c'est lui qui gérera leur cycle de vie et pas des bidouilles dans la C-Runtime.

    Si vous avez besoin de réinitialiser des valeurs quand vous changez d'onglet, c'est votre code VBA qui aura les billes pour le faire, etc ...

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

Discussions similaires

  1. Réponses: 40
    Dernier message: 21/06/2007, 18h58
  2. [xsl-fo]Problème de données dynamiques dans un tableau.
    Par Little_flower dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/05/2007, 11h35
  3. extraction de données formatées dans un fichier excel
    Par slausseur dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/03/2007, 16h00
  4. Réponses: 7
    Dernier message: 21/12/2005, 17h44
  5. Problèmes avec un TWebBrowser dans une DLL
    Par bellamyjc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/01/2005, 23h35

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