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

Visual C++ Discussion :

exception non gérée entre Excel VBA 2010 et Visual Studio C++ 2022


Sujet :

Visual C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut exception non gérée entre Excel VBA 2010 et Visual Studio C++ 2022
    Bonjour
    J’ai un étrange problème que je ne sais pas résoudre.
    Je suis ingénieur retraité, et, sans être informaticien de formation, ai beaucoup fait de calculs en Fortran et Excel VBA.
    Depuis une douzaine d’années, je m’intéresse aux compétitions de courses virtuelles à la voile chez Virtual Regatta.
    Et j’ai développé un routeur, donc un gros programme permettant, à partir des vents prévus sur le site météo américain NOAA et de divers fichiers (profils des côtes, polaires des voiliers … ) de calculer la meilleure route possible pour le voilier.
    Ce routeur est basiquement en Excel VBA 64 bits, avec appel à des routines de calcul dans une dll écrite en Visual Studio C++ 64 bits dès qu’une partie des calculs devient très lourde.
    Comme je n’ai pas envie de passer du temps à apprendre les subtilités de C++, tout est basique. Pas de New, re Redim, … Tous les tableaux sont donc définis en dimensions fixes, sans aucune subtilité.
    Avec la même philosophie en VBA.
    J’ai deux ordinateur, un assez gros fixe, vieux i7, 16Go de mémoire, et un vieux portable, i3, 6 Go.
    Et depuis quelques temps, j’ai des plantages en débug C++ sur une ligne qui ne présente aucune difficulté : « void __stdcall CopieVentsEC(int & Prévision, double & Latitude, double & Longitude, double & Direction, double & vitVentNd) »
    Une exception non gérée a été levée : violation d'accès en lecture Longitude a été nullptr
    Prévision et Latitude sont transmises correctement, pas les trois autres arguments.
    La ligne d’appel en VBA est simple :
    Call CopieVentsEC(Prévision - 1, Latitude, Longitude, VentDirection, VentVitesse)
    Et sa définition me semble correcte :
    Declare PtrSafe Sub CopieVentsEC _
    Lib "G:\MesFichiers\VirtualRegatta\_C++\_RoutageC93\_RoutageC\x64\Debug\_RoutageC.dll" _
    (Prévision As Long, Latitude As Double, Longitude As Double, VentDirection As Double, VentVitesse As Double)
    Mais le plus étonnant est que, si je copie sans la moindre modif les fichiers du fixe qui plante vers le mobile, le programme y fonctionne parfaitement.
    Sur le fixe, j’ai donc :
    - Gonflé la mémoire à 16 Go,
    - Totalement réinstallé W10 en écrasant tout, avec toutes les mises à jour
    - Réinstallé Office 2010, donc Excel
    - Réinstallé Visual Studio C++ 2022, à jour
    - Créé un projet neuf dans lequel j’ai inclus mes fichiers sources .cpp et .def
    Bref, j’ai fait tout ce qui me semblait faisable.
    Et ça plante toujours, et seulement sur le fixe.
    Si quelqu’un a une idée ???
    Merci.
    P.S. Office et Visual Studio sont en 64 bits.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Bonjour @Reves de gosse 83,

    Il y a beaucoup beaucoup de paramètres qui peuvent entrer en jeu.

    Si votre code est Open Source et que vous n'arrivez pas à faire un code minimaliste pour reproduire le problème, pouvez-vous mettre votre projet dans un dépôt Git comme sur GitHub ou GitLab ?

    Si vous pouvez avoir un Excel et un code C++ (ou mieux un projet VS) minimaliste qui reproduit le problème, pouvez-vous les poster dans ce fil de message ?

    J'ai pas mal d'hypothèses mais avec un code compilable et "lançable", on irait directement au point d'achoppements.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Merci
    Merci pour votre réponse, mais à la foi les codes, en C++ et VBA, sont très gros, du genre usine à gaz, mais lorsque je cherche le minimum, tout fonctionne parfaitement dans le passage d'arguments.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Les gestionnaires de dépôt Git comme GitHub ou GitLab acceptent des tailles de code source énormes.

    Pour un projet fait par une seule personne, il y a très peu de chance que cela n'entre pas.

    Si votre projet est assez bien structuré, dans quelques répertoires, la mise en dépôt est assez rapide et demande assez peu de manipulation.

    Cela permettrait de facilement partager votre projet avec d'autres personnes, et, en bonus, une sauvegarde de vos sources dans le "cloud".

    Je vous invite chaudement à investir un peu de temps dans la mise en dépôt de votre projet.

    Sinon, il y a une ambiguïté dans le code VBA qui me fait tiquer.
    Vous ne spécifiez pas dans la signature de votre procédure "CopieVentsEC" comment on transmet les paramètres : "ByRef" ou "ByVal" ?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En standard, VBA est implicitement par référence.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Passage par référence, cela implique la mise en place d'un middleware car le modèle mémoire du C++ n'a rien à voir avec celui de VBA.
    Vous avez vraiment de passer des références au code C++ ?
    Si "CopieVentsEC" n'est pas sensé changer les valeurs des paramètres ou que ces changements n'ont pas a être visibles par l'appelant, on passe "normalement" les paramètres de type double, float ou les "int" par valeurs.
    Passer des références comme paramètre d'une fonction en C++, c'est que l'appelant doit voir les modifications des valeurs faites par la fonction appelée.

    Moi, de manière "naturelle", je ne tente pas de faire du partage de données "implicites" entre des trucs aussi différents (VBA Excel / C++ Runtime).
    J'aurais passé tous les paramètres par valeur et s'il y a besoin de données en retour, cela serait passé par une structure COM en type de retour.
    En passant par une structure COM, les 2 runtimes disposes de la même représentation "interne" des données.

    Comme il y a une mise en place d'un middleware, on n'est pas à l'abri d'un changement de comportement en fonction de la configuration de la plateforme d'exécution.
    Il n'est pas exclu que le middleware fasse l'encapsulation des paramètres via des types COM, mais j'en suis pas sûr.

    Si vous ne voulez pas partager votre projet dans un dépôt Git, pouvez-vous nous fournir un projet minimal reproduisant le problème ?

Discussions similaires

  1. Lien entre Excel (VBA) et SAP (CJ20N)
    Par hell3 dans le forum SAP
    Réponses: 3
    Dernier message: 24/10/2020, 15h38
  2. [Débutant] Filtrer entre 2 dates un fichier excel à partir de visual studio
    Par LGPC24 dans le forum Développement Windows
    Réponses: 8
    Dernier message: 04/12/2016, 18h02
  3. Créer un lien entre Excel VBA et MySQL
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/07/2016, 16h20
  4. vba (word) vers visual studio 2010
    Par knarf44 dans le forum Visual Studio
    Réponses: 2
    Dernier message: 02/08/2011, 13h49
  5. Choix entre Excel (VBA) et 1 appli exe (Qt)
    Par gui80 dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 16/03/2011, 11h03

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