Problèmes de headers avec DLL malgré compilation ok

Signaler
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
-
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
-
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

15 réponses

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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 ?

class MY_DLL CScene
{
private:

// Engines
// CPhysic* m_pPhysic;
// CDirect3D* m_pDirect3D;

// Entities
CObject** m_ppObjects;
CGeometry** m_ppGeometries;
CMaterial** m_ppMaterials;

// Parser
CParser* m_pParser;

DWORD m_dwNumObjects;
DWORD m_dwNumGeometries;
DWORD m_dwNumMaterials;

// Sort for Z-buffer
// CObject** m_ppZSortObjects;
// float* m_pDistances;
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
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.

Bonne chance ...
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
As tu essayé de faire les déclarations de classe "en avant" sur les objets qui plantent ?

DLL_EXPORT class CPhysic;
DLL_EXPORT class CDirectD;

class DLL_EXPORT CScene
{
};

Les fonctions virtuelles exportées doivent etre visible du client (inline)
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Après relecture de ton post :
En fait ça serait plutôt un problème d'#include.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Salut,

Si je change:
CObject** m_ppObjects;
CGeometry** m_ppGeometries;
CMaterial** m_ppMaterials;
en:
CObject bonjour;
CGeometry**** au_revoir;
CMaterial******** salut;

ça compile, et ça ne plante pas.
Je ne sais vraiment pas quoi faire .

A terme, je veux supprimer un max de fichiers headers (ce qui sont inutiles pour le compilo).
Mais c'est mal parti .
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Et avec la syntaxe : 
CObject* m_ppObjects[];   // ?? 
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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û ?
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Rebuild a chaque fois le .LIB, en as tu peut etre plusieurs versions ?
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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:

class MY_DLL CScene  
{
private:
// CPhysic* m_pPhysic;
// CDirect3D* m_pDirect3D;
CObject** m_ppObjects;
CGeometry** m_ppGeometries;
CMaterial** m_ppMaterials;
CParser* m_pParser;
DWORD m_dwNumObjects;
DWORD m_dwNumGeometries;
DWORD m_dwNumMaterials;
// CObject** m_ppZSortObjects;
// float* m_pDistances;

par

class MY_DLL CScene  
{
private:
CPhysic* m_pPhysic;
CDirect3D* m_pDirect3D;
CObject** m_ppObjects;
void** m_ppGeometries;
void** m_ppMaterials;
void* m_pParser;
DWORD m_dwNumObjects;
DWORD m_dwNumGeometries;
DWORD m_dwNumMaterials;
void** m_ppZSortObjects;
float* m_pDistances;

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...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
un pointeur sur void prend 4 octets si je ne m'abuse et un pointeur sur CObject prend aussi 4 octets ! donc quelle est la difference ????
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.

Je vais DL la .net pour tester.
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
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 !!!

KeniiyK
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
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...).

KeniiyK