-
DLL appellée par VBA
Bonjour,
Je m'excuse d'avance si je me suis planté d'endroit de post... c'est assez flou comme sujet.
J'en appelle à vous pour me trouver toutes les idées (même incohérante) qui pourraient expliquer mon problème :
J'ai écrit une DLL en C++ que j'appelle via une procédure en VBA.
A priori, la fonction marche, j'ai fait pas mal de tests sur plein de données....
Maintenant, je l'ai mise en production dans une grosse boucle en VBA, et je l'appelle à la chaine, plusieurs centaines de fois.
Le souci, c'est qu'au bout d'un certain nombre d'appel (variant entre 1 et 500), il arrive à Excel de completement cracher. (Message de rapport d'erreur windows... etc)
J'ai exclu par test le reste du programme: apparament, c'est au niveau de la DLL que ça plante, et cela ne viens pas de mes paramètres d'entée.
Une idée : n'importe quoi... ça m'aiderai d'en discuter ^^
-
Renseignes toi sur le net sur la création de fichiers XLL. Sur le site du support Microsoft il y a un tutoriel pour en créer. Peut être que ce format sera plus adapté à Excel.
Et si j'étais toi je ferai un test de boucle avec ta dll dans un projet pur VB et non dans l'hôte Excel pour tenter de déterminer si le problème viens de ta DLL ou d'Excel lui même quand il gère la dll.
Autre chose: déclare toutes tes variables en VB (ajoute "Option Explicit" en haut de tes feuilles de codes). En production j'ai repéré des merdes incoyables sur les grosses boucles en VB avec des indices non déclarés (saut d'indice par exemple).
Dans ton code (DLL et VBA) assures toi de bien libérer tes variables quand tu n'en as plus besoin, en particulier les objets.
Est ce que ton code fait appel à la pile?
Sinon il te restera à examiner les types de données de chaque variable car ils ne sont pas identiques en VB et C++. En vb pas de notion de variables signées ou non, par exemple. Un mauvais passage de paramètre peut tout faire foirer.
J'espère que quelques trucs pourront t'aider là dedans car les problèmes de DLL sont assez ardus.
-
Merci pour ta réponse :)
J'ai fait enormément de test, mais le truc plantant assez rarement, je n'ai encore pas réussi à identifier quand est-ce que ça plantait exactement.
J'ai fait 1000 appels successifs avec les même données => plante pas
J'ai enregistrés les données juste avant l'appel, pour pouvoir le refaire avec les même, et lorsque ça plante 1 fois, ça ne replante pas avec les même entrées.
Je vais essayer de déclarer avec "Option Explicit" les variables que je passes en paramètre, c'est une bonne idée.
Un autre truc : En effet, dans mon code C++, je fais des malloc (uniquement type simple - int, double), mais étrangement, l'appel de la fonction "free" fait systématiquement planter la fonction, je n'ai donc aucun free, et mes allocations sont fait immédiatement au début de la première fonction. Une idée de pourquoi (parce que j'aime pas laisser mes variables dans le vent :s)
Normalement, les correspondances de type ont été respecté, dans la mesure ou je n'utilise que des int/Long et double/Double
-
en plus si tu laisses tes variables dans le vent j'imagine qu'en effet ça fait quelques résidus que ne doit pas aimer le code. Il y a un garbage collector en c++ j'imagine?
Et non je ne vois pas pourquoi il ne veut pas que tu libères les variables.
te reste la piste du XLL:
http://support.microsoft.com/kb/178474
tiens j'ai trouvé ça aussi
http://msdn.microsoft.com/en-us/library/bb687861.aspx
-
Bonjour,
J'ai regardé les liens que vous m'avez fourni sur les XLL, et un peu au délà sur le net, mais j'ai l'impression d'avoir déjà fait quelques recherches à ce sujet (il y a longtemps), donc avant de me lancer dans un periple de débug sans nom, je me pose la question suivante :
Dans le tutorial en question, on utilise des fichiers du "SDK pour Excel 97" valable pour Visual C++ 6.0 ... En cherchant un peu plus loin sur le net, on peut aussi trouver de la doc sur "comment faire un XLL pour Excel 2007" avec "SDK pour Excel 2007" et VS 2005.
Moi, je suis sous VS 2008, et Excel 2003. De mémoire, je n'avais pas réussi à même compiler le source fourni dans le SDK 97, mais ma mémoire peut me jouer des tours et si vous me dites que c'est cencé être compatible, je m'y jeterai tête baissée :p
-
Bonjour,
Je reviens à nouveau vers vous avec mon histoire de DLL et soudainement un gros doute. Déjà, j'ai fait énormement de recherche et vais donc vous faire partager quelques liens qui m'ont été très utlise.
Explication extrèmement détaillée, et ne se contente pas de parler du comment mais aussi du pourquoi.
http://xcell05.free.fr/pages/prog/api-c.htm
En anglais, mais excellent tutorial pour les versions adapté à 2007. Je n'ai pas encore réussi à utiliser son travail pour faire marcher sur 2003, mais ça doit pas être très loin.
http://blogs.msdn.com/andreww/archiv...h-vs-2008.aspx
Pas mal de documentation (anglais aussi) sur comment configurer son Visual Studio pour faire une XLL.
http://www.codematic.net/Excel-devel...dk-install.htm
Mais la question qui me tracasse :
J'ai bien le sentiment qu'une XLL est une librairie qui est appellée dans Excel, et en aucun cas en VBA :s
Si c'est le cas, la XLL n'est pas du tout la solution à mon problème, car mes données sont chargé d'un serveur web via une interface VBA, et donc jamais "écrite" dans le fichier Excel.
Je me trompe ?
-
Salut
Je n'ai pas de réponse en se qui concerne les XLL, par contre j'ai déjà eu soucis similaire de bug aléatoire sur un programme Delphi (sur un composant).
Le crache ne se produisait jamais au même endroit ni au même moment, je mettais donc orienté vers un soucis de stockage en mémoire, je n'ai plus l'erreur exact en tête, mais j'avais forcé l'utilisation de la mémoire en utilisant des boucles et des savetomemory, (2Go de ram) autant dire que c'était toujours aléatoire, mais j'ai fini par trouver en faisant comme ça, il y a peut etre de meilleur solution pour utiliser la mémoire, comme les soft de test des barrettes.
Je ne suis pas super claire, mais c assez flou, je ne me souvient plus trop du soucis. J'espère t'avoir donné une nouvelle piste.
A++
Qwaz
-
Bonjour,
Bon, j'ai finalement trouvé un bout de code suspect dans ce que j'avais fait. C'est bien possible qu'il soit responsable de tous mes malheurs... J'ai envoyé un fichier pour tester en production, et je coche résolu lundi si c'est bon :)
Merci à tous.
-
les xll sont en effet à ma connaissance des bilbiothèques appelées par excel.
Désolé de t'avoir induit en erreur.
Et merci pour tes liens, ils sont extrêmement instructifs.
-
Oui, donc je voulais juste confirmer que le principale problème était réglé. Il provenait d'une erreur d'indice qui fait que j'écrivait parfois dans une zone de mémoire non allouée. -_-
J'ai pas encore réglé tous mes problèmes, mais celui-ci oui.
Merci à tous pour votre temps.