Problèmes de headers avec DLL malgré compilation ok

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 26 nov. 2006 à 00:03
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Derniè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

15 réponses

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

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;
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
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.

Bonne chance ...
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 16:20
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 16:23
Après relecture de ton post :
En fait ça serait plutôt un problème d'#include.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
26 nov. 2006 à 16:39
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 .
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 16:45
Et avec la syntaxe : 
CObject* m_ppObjects[];   // ?? 
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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û ?
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 16:54
Rebuild a chaque fois le .LIB, en as tu peut etre plusieurs versions ?
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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:

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...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 17:44
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 ????
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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.

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

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

KeniiyK
0
Rejoignez-nous