Problèmes de headers avec DLL malgré compilation ok
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 2008
-
26 nov. 2006 à 00:03
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 2007
-
1 déc. 2006 à 09:41
Salut,
J'ai un gros projet qui utlise des dll persos (dll pleines de classes).
ET j'ai un problème avec ma dernière dll.
Elle se compile nickel.
Je met la lib, la dll et TOUS les headers (nécessaires à la compilation de la dll) avec le programme principal, pas de pb, il compile se lance et ne bugge pas :D.
Ensuite je vire les headers, supprime les membres publics des classes de la dll, supprime plein de fonctions, bref, ne laisse que le strict minimum pour que la compilation réussi.
C'est le cas, compilation ok, le programme se lance, mais là, crash dès le premier clic ou lors de la sortie !
Comment ça se fait ?
Mon programme compilé n'est pas censé être exactement le même malgré ce que je fais avec les headers tant que la compilation réussi ?
J'aimerais avoir vos avis.
Merci
A voir également:
Problèmes de headers avec DLL malgré compilation ok
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 26 nov. 2006 à 00:30
J'en sais un peu plus sur la cause du crash.
Après plusieurs tests, j'ai vu que le programme commence à crasher quand je retire certains attributs à la classe CScene (la classe CScene est dans la dll, mais le programme a besoin de son header, c'est ce header que je veux réduire au minimum).
Ci-dessous les attributs 'private' dans le fichier "Scene.h".
Ceux avec // devant ont pu être retires sans faire crasher le programme.
Les autres ne sont pas desactivés sinon crash.
Il n'y a aucune raison que ça bugge.
Avez-vous eu un problème similaire ?
Ombitious_Developper
Messages postés2333Date d'inscriptionsamedi 28 février 2004StatutMembreDernière intervention26 juillet 201339 26 nov. 2006 à 01:40
Salut:
Je ne pense que le bug est dû à un "fichier" apparement tu utilises beaucoup de pointeurs (Et c'est là que viennent la majorité des bugs), essayes de tester ton programmes en mode console avant de le mettre en DLL.
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 26 nov. 2006 à 14:41
Je ne pense pas que le problème vienne de pointeurs (il y en a beaucoup plus dans les autres classes ;)), car le programme fonctionne parfaitement lorsque tous les headers sont là.
En fait j'ai un seul fichier cpp, main.cpp.
Les autres fichiers sont les headers des classes contenues dans les dll (pour que le compilateur reconnaisse les objects).
Pour le link, il y a les .lib.
Le programme fonctionne et ne plante pas quand tous les headers sont là.
(donc aucun bug du code)
Normalement, je peux supprimer des attributs et des fonctions des fichiers headers sans changer le resultat de la compilation, donc sans changer le programme. Ceci ne revient pas à changer le code car le code est figé dans les dll.
Or la ces modifications conduisent à un crash.
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 26 nov. 2006 à 16:50
Dans ce cas le compilo rale.
Mais je peux mettre ce que je veux sinon et ça passera tant que je ne supprime pas la ligne.
Apparement le programme plante juste avant que le classe scene soit détruite cad entre la derniere ligne de code de son destructeur et la ligne qui suit sa demande de destruction.
A quoi ça peut être dû ?
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 26 nov. 2006 à 17:32
Oui, je rebuild to from scratch et je remplace lib et dll pour être sûr.
Là j'ai CObject* m_ppObjects[358]; et ça passe.
En virant les fichiers geometry.h, material.h et parser.h ainsi que tous les liens s'y rapportant, ça ne plante plus quand je supprime les lignes avec CGeometry CMaterial et CParser...
Je dois par contre laisser une ligne avec CObject dedans car je ne peux pas supprimer le fichier object.h dont certaines fonctions doivent être accessibles par l'utilisateur de la dll.
C'est bizarre mais c'est comme ça !
.....
Rectification:
CObject* m[7]; fonctionne
CObject* m[6]; ne fonctionne pas.....
void* m[7]; fonctionne
void* m[6]; ne fonctionne pas.
Apparement, le compilo a besoin de la taille de CScene qu'il calcule gràce au header et pas gràce à ce qu'il y a dans la DLL.
J'ai un new CScene dans le main.cpp.
Donc je vais remplacer:
ainsi le compilo calculera la bonne taille et je pourrais supprimer les headers de parser, geometry et material.
C'est très crade, je vais essayer de trouver mieux...
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 26 nov. 2006 à 17:51
Le compilo connait void, pas CGeometry.
Donc râle s'il y a CGeometry.
Pour l'instant s'il y a moins de 24 octets de définition dans CScene ça ne passe pas.
char c[25]; ça passe
char c[24]; ça casse
Je peux laisser char c[25]; mais ça fait moins propre que de laisser les vrais attributs quitte à remplacer par des void les objects dont les définitions ont été effacées.
Je poursuis quand même les recherches car ça me parait louche.
La je tourne sous VC++ 6.0.
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 28 nov. 2006 à 13:02
Salut Galmiza, j'ai exactement eu (il me semble...) le même problème, c'est quand je développais des pluggins pour 3DSMax6 (je pense que tu connais ce soft). Ces pluggins sont sous forme de DLL et quand je séparais le header "principal" en deux la compilation se déroulait très bien mais crash à l'exécution (alors que pas de pb si pas de scindement du header).
J'avais laissé tombé mais cela m'interesserai de comprendre, je m'y recolle ce soir !!!
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 30 nov. 2006 à 17:21
Je n'ai pas eu le temps de chercher plus loin, mais en tous cas, il semble que le problème viennent du fait que la taille de la classe dépasse 24 octets.
Oups, je viens de voir qu'avec une autre classe qui fait largement plus de 24 octets, le problème ne s'est pas posé...
Bref, la seule solution pour ma classe CScene est de lui mettre plus 24 octets dans le header à joindre à la DLL.
Qu'est ce qui se passe si tu laisses les attributs de la classe dans le header que tu joins à la DLL (quitte à remplacer les classes ou structures non définies par des types de tailles équivalentes) ?
Je vais passer sous Visual Express la semaine prochaine pourvoir c'est la faute du compilateur.
PS: En ce qui concerne les plugins 3DSMax6 connais-tu des bons tutoriaux pour apprendre à en créer ?
Pour l'instant je carbure au scripts.
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 1 déc. 2006 à 09:41
Désolé, je n'ai pas encore eu le temps de m'y remettre ne serait-ce que 5 minutes. Mais je testerai cette histoire de taille dans le header de la DLL.
Pour démarrer sur les plug 3DSMax6, j'avais trouvé des plugs avec les sources puis a force d'acharnement, j'avais réussi à pondre un premier plug, puis un second, etc... Déja il faut avoir le SDK de 3DSMax, ensuite tu installe le wizard pour VC++6 qui te permet de creer un projet de plug et le squelette du code. Je te fournirai la liste des sites ou j'ai trouvé mes infos et les plugs avec sources mais sache que je n'ai pas trouve de supers tutoriaux (voir aucun il me semble...).