Classes, méthodes et DLLs [C++] - C++ - Programmation
Marsh Posté le 03-11-2005 à 11:39:32
t'as le code des fonctions des dll qui sont appelées ? (ou juste leur prototype ?)
me demande si t'as pas un probleme de convention d'appel
Citation : ZeroMemory( this, sizeof( TWB_Extension ) ) |
Alors ca c'est meme pas interdit, c'est pire que ca ! A la revolution on t'aurais decapité sur le champ. Mets a NULL/0 membre par membre, mais surtout fait pas ca ! (Tu risques d'ecraser ton pointeur de V-Table)
Sinon d'une maniere generale :
Code :
|
tu tiens reelement a faire une alloc dynamique alors qu'une statique te simplifierait la vie ? (encore que vu les noms de variables j'ai comme un doute )
Marsh Posté le 03-11-2005 à 11:43:06
ReplyMarsh Posté le 03-11-2005 à 11:49:46
chrisbk a écrit : t'as le code des fonctions des dll qui sont appelées ? (ou juste leur prototype ?) |
C'est moi qui les ai faites
Enfin pour l'instant, en test.
Code :
|
Code :
|
Code :
|
chrisbk a écrit :
|
Je ne suis qu'un piètre codeur
chrisbk a écrit :
|
Qu'est ce qu'elles ont mes variables?
Ouais, j'suis obligé. Là j'ai fait un truc pourri pour tester, mais le vrai code n'est pas comme ça. Je réupère les extensions dynamiquement, et je les fous dans une liste chainée, et je parcours la liste quand j'dois faire du carnage. M'enfin tout ça c'est déjà dans l'analyse, c'est codée, y a juste le p'tit truc là qui m'emmerde
Donc j'ai réduit au maximum pour trouver d'où venait le pb, d'où le code un peu pourri que tu vois ci dessus
Marsh Posté le 03-11-2005 à 11:50:32
chrisbk a écrit : (pis t'appelle meme pas ton beau unload ) |
Je l'appelle dans le vrai code mais là j'm'en fou ça plante avant
J'vais finir par le foutre si tu continues
(en plus, le unload ne correspond même plus à l'inverse du load vu que j'ai du foutre un init à la con entre temps, pitoyable )
Marsh Posté le 03-11-2005 à 11:53:31
godbout a écrit : C'est moi qui les ai faites |
bon bin la tu les declares en stdcall alors que par defaut la convention est cdecl
donc soit tu les modifies dans la dll, soit tu modifies ton typedef (ce qui me semble le mieux)
typedef __stdcall __int32 (*LPMONTRUC)();
jte garanti pas que ca sauve le tout mais deja ca sera un soucis en moins
Citation : Je ne suis qu'un piètre codeur |
bin améliore toi Vire ca c'est super super dangeureux
Citation : Qu'est ce qu'elles ont mes variables? |
rien, juste le nom ...
Marsh Posté le 03-11-2005 à 12:00:36
chrisbk a écrit : |
J'peux que modifier le typedef ouais, vu que la dll d'exemple que j'ai faite est pompée sur les "vraies" dlls, qui elles ne doivent pas être modifiées.
chrisbk a écrit : |
J'crois que tu sais que j'ai du mal d'améliorer quoique que ce soit avec un boss qui dit que les typedef c'est has been
chrisbk a écrit : |
Tu me proposes quoi ?
Quel con j'avais pas calé le coup des var_
Une innovation technique
Marsh Posté le 03-11-2005 à 12:05:16
Citation : |
Nan mais justement au vu du nom jpensais que ce code etait pas de toi
Marsh Posté le 03-11-2005 à 12:06:43
godbout a écrit : J'crois que tu sais que j'ai du mal d'améliorer quoique que ce soit avec un boss qui dit que les typedef c'est has been |
Au bûcher.
Marsh Posté le 03-11-2005 à 12:07:06
chrisbk a écrit :
|
J'ai tenté une rebellion mais ça n'a pas marché, et on m'a bien fait comprendre la dernière fois que j'étais pas apte à décider
Donc je met des var_ pour les variables
Bon, je tiens quand même le coup avec mes typedef, mais je sais pas pour combien de temps
Marsh Posté le 03-11-2005 à 12:08:37
ReplyMarsh Posté le 03-11-2005 à 12:08:47
blackgoddess a écrit : Au bûcher. |
Arrêtez voir avec ça, ça me rappelle ce qu'on me dit quand je joue de la guitare
Euh, sinon j'ai changé, mais rien n'y fait.
Marsh Posté le 03-11-2005 à 12:09:18
chrisbk a écrit : bon alors ca améliore les choses mon truc ? |
Je me sens meilleur codeur, mais ça chie toujours autant
Marsh Posté le 03-11-2005 à 12:14:16
Attends, ça marche maintenant
J'avais viré le ZeroMemory, mais j'avais pas initialisé toutes les variables de la classe à NULL (juste celle qui sont utilisées dans le code). Apparemment ça viendrait de là.
C'était toujours après le Load, juste au moment de quitter la fonction.
Marsh Posté le 03-11-2005 à 12:15:37
moi jpense que ca vient aussi de mon histoire de convention d'appel (ce qui est appuyé par le lieu du plantage)
Marsh Posté le 03-11-2005 à 12:16:20
Attends je vire, on verra bien
Parce que j'avais bien mis tes conventions, mais ça chiait toujours.
Marsh Posté le 03-11-2005 à 12:17:27
J'en sais rien du tout
Peut être le ZeroMemory?
Pourtant en le virant ça chiait toujours dans la colle.
Marsh Posté le 03-11-2005 à 12:18:33
J'ai remis le ZeroMemory ça marche
Bon écoute, j'réessaye dans mon "vrai" code et pas ma petite appli test pourrie, et j'te dis
Marsh Posté le 03-11-2005 à 12:20:35
jpige pu rien
refait voir le code apres modif
Marsh Posté le 03-11-2005 à 12:22:20
jcomprends pas comment ca marche avec des conventions d'appel differentes oO
puis le ZeroMemory est drolement scabreux.
Marsh Posté le 03-11-2005 à 12:23:19
blackgoddess a écrit : jcomprends pas comment ca marche avec des conventions d'appel differentes oO |
sur une fonction avec 0 argument, ca change rien (le stdcall / cdecl), par contre sa fonction avec un entier normalement ca devrait cacater
Marsh Posté le 03-11-2005 à 12:24:17
Code :
|
Ca a l'air de marcher dans ma vraie appli aussi, merci
Par contre, en remettant crado comme avant, j'ai pas réussi à refaire planter
Au fait, si tu vois un autre truc à améliorer dans le code, n'hésite pas
Marsh Posté le 03-11-2005 à 12:25:51
blackgoddess a écrit : |
Moi qui pensait avoir trouvé un tip super
A votre avis ça passe sur le site où on se fout de la gueule des erreurs des autres ?
Marsh Posté le 03-11-2005 à 12:26:49
chrisbk a écrit : |
Quelle maîtrise. J'en savais rien du tout. On me file la DLL avec les conventions là, j'ai pas cherché à savoir, honte à moi.
Par contre effectivement, ça plantait seulement avec une function à paramètres.
Marsh Posté le 03-11-2005 à 12:27:19
bin les Dependencies = NULL; dans le destructeur ca sert a rien
j'aime pas trop les var_Ret, je prefere mettre un return, meme au plein milieu d'une fonction (et c'est mon choix(tm)), et plutot que de faire
Code :
|
je prefere faire
Code :
|
bon, la c'est question de gout. Sinon t'as des lignes qui servent a rien mais c'est pas trop grave
Marsh Posté le 03-11-2005 à 12:29:14
godbout a écrit : |
hein ?
godbout a écrit : Quelle maîtrise. J'en savais rien du tout. On me file la DLL avec les conventions là, j'ai pas cherché à savoir, honte à moi. |
bah pas grand monde se penche sur ce genre de blague enfin la convention d'appel c'est important, si y'a rien mets rien si y'a qqchose bin mets la meme. Jte ferais un cours sur les conventions d'appel si ca te chante
Marsh Posté le 03-11-2005 à 12:31:25
chrisbk a écrit : bin les Dependencies = NULL; dans le destructeur ca sert a rien |
Ouais, je sais que ça sert à rien, mais j'préfère faire tout le temps le même schémà, et ne pas oublier de mettre à NULL une fois ou j'en aurai besoin que l'inverse
Mais sinon je vire hein
Je veux devenir un vrai codeur comme Bill Gates.
chrisbk a écrit :
|
Ouais, alors ça j'ai mis du temps à me décider. J'me suis dit que les return c'était dès fois un peu traitre, genre quand t'as ton LoadLibrary plus bas... A moins de refoutre un LoadLibrary devant chaque return, mais que tu viens pour modifier le code, tu le vois pas forcément.
chrisbk a écrit : |
Genre genre genre dis moi tout
Si tu parles des grands if () au lieu de foutre sur une ligne, c'est pour la lisibilité
Marsh Posté le 03-11-2005 à 12:32:19
chrisbk a écrit : |
Ouais, j'avais pas fait gaflle, le con
Pour le cours, ça va attendre, je sais pas si j'vais continuer longtemps dans cette voie là
Marsh Posté le 03-11-2005 à 13:37:00
[quotemsg=1237380,32,19632
Genre genre genre dis moi tout
Si tu parles des grands if () au lieu de foutre sur une ligne, c'est pour la lisibilité [/quotemsg]
bin genre ca
Code :
|
chui une niasse, je concatene
Code :
|
Marsh Posté le 03-11-2005 à 13:37:05
je suis interressé moi
mais en fait jvais googler au lieu de demander betement, jreviendrais si je comprends pas, mci
Marsh Posté le 03-11-2005 à 13:37:56
blackgoddess a écrit : je suis interressé moi |
y'a un article de la msdn assez causant la dessus
en deux mots, la convention change :
-ou tu mets les parametres et dans quel ordre (pile ? registre ?)
-qui fait le menage dans les parametres a la fin de la fonction (appelant ? appelé ?)
Marsh Posté le 03-11-2005 à 13:41:36
chrisbk a écrit : [quotemsg=1237380,32,19632 |
bin genre ca
Code :
|
chui une niasse, je concatene
Code :
|
[/quotemsg]
Ah ouais celui là il est flagrant
Marsh Posté le 03-11-2005 à 13:43:54
bin ya cui la aussi
Code :
|
ca pourrait se concatener en
Code :
|
c'est super verbeux ton truc
Marsh Posté le 03-11-2005 à 13:53:53
Oui mais nan, parce que le vrai code c'est ça :
Code :
|
Mais bon, c'était bien le coup des __stdcall merci
Par contre j'ai juste un p'tit problème avec une fonction qui retourne un const char*, ça compile pas avec le __stdcall. J'peux le virer sans pb? (le mauvais )
edit: Si j'met le __stdcall après le type (int, const char*, etc...), ça compile. D'ailleurs c'est comme ça dans les dlls, ça marche aussi ?
Marsh Posté le 03-11-2005 à 13:54:30
chrisbk a écrit : |
C'est pour que ce soit plus lisible pour quand je patirai
Marsh Posté le 03-11-2005 à 11:35:47
J'ai un problème vraiment très bizarre...
J'ai une classe avec différentes méthodes. Dans des une méthodes, une DLL est chargée (l'instance est gardée dans une variable membre de la classe) et quelques fonctions d'initialisation de la DLL sont appelées. Dans d'autres méthodes, j'appelle d'autres fonctions de la DLL.
Dès que j'appelle, dans ces autres méthodes, une fonction qui passe des paramètres, j'ai un plantage à la sortie de la méthode
Ca arrive souvent lorsqu'un pointeur n'est pas deleté, mais là j'ai beau cherché, je ne trouve pas
Un peu d'aide serait donc la bienvenue
Voilà le code de la classe :
Y a des trucs moisis dedans, mais c'est parce que j'fais des tests pour trouver le pb
Le code normal est entre commentaires, mais je vous l'ai viré.
Le code de déclaration :
Et ça plante dans la rtl60.bpl, en appelant une fonction qui s'appelle CallDynaInst.