|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : GetWindowLong, cast & méthodes virtuelles [ Windows / Autre ] (MyXiLo)
Informations & options pour cette discussion
jeudi 1 juin 2006 à 20:51:02 |
GetWindowLong, cast & méthodes virtuelles

MyXiLo
|
Bonsoir, Mon soucis est que, lorsque je cast le resultat d'un GetWindowLong en un pointeur, l'appel d'une fonction virtuelle de l'objet pointe provoque une erreur lors de l'execution (" Unhandled exception at 0x0040149c in Ivy.exe: 0xC0000005: Access violation reading location 0x00000000.", avec VS 2005). class MaClasse { virtual void MaFonction(); }
static LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { MaClasse *MonObjet=(MaClasse *)GetWindowLong(hwnd, GWL_USERDATA); MonObjet->MaFonction(); // Genere une erreur si MaFonction est déclarée virtual }
(Je precise que ma WindowProcedure est bien definie pour une WNDCLASSEX appartenant à MaClasse(dans cet exemple)).
Ce serait une erreur de debutant que ca n'aurait rien d'etonnant puisque j'en suis un :}.
Merci d'avance. Thomas.
|
|
|
jeudi 1 juin 2006 à 20:56:13 |
Re : GetWindowLong, cast & méthodes virtuelles

vecchio56
|
J'ai déja eu ce problème. Au moment du SetWindowLong, il faut que tu castes en (MaClasse*) (j'imagine que le vrai type de l'objet n'est pas MaClasse, mais un sous-type de MaClasse)
|
|
|
jeudi 1 juin 2006 à 21:04:08 |
Re : GetWindowLong, cast & méthodes virtuelles

MyXiLo
|
Je cast deja en (MaClasse *) au moment du SetWindowLong en realite. Effectivement c'est un sous-type, mais, meme si MaClasse n'est pas derivee, ca pose tout de meme un probleme.
Merci pour cette reponse tres rapide.
|
|
|
jeudi 1 juin 2006 à 21:08:20 |
Re : GetWindowLong, cast & méthodes virtuelles

vecchio56
|
Réponse acceptée !
C'est plutot bizarre ca... Pour tester, tu peux essayer ca:
MaClasse* o1 = new ...; LPARAM l = (LPARAM)o1; MaClasse* o2 = (MaClasse)l; o2->MaFonction();
Au pire, compare les adresse des objets de départ (au moment du SetWindowLong) et à l'arrivée (GetWindowLong). Je suppose qu'ils seront différents (c'est comme ca que j'avais détecté le problème quand je l'avais eu)
|
|
|
jeudi 1 juin 2006 à 21:34:03 |
Re : GetWindowLong, cast & méthodes virtuelles

Zootella
|
Si le retour de GetWindowLong est NULL, c'est logique que ça plante.
Test l'objet avant de l'utiliser.
|
|
|
jeudi 1 juin 2006 à 21:35:43 |
Re : GetWindowLong, cast & méthodes virtuelles

vecchio56
|
Apparemment ca plante seulement quand la méthode est virtuelle
|
|
|
jeudi 1 juin 2006 à 22:41:32 |
Re : GetWindowLong, cast & méthodes virtuelles

MyXiLo
|
En fin de compte je viens de me rendre compte que c'est mon SetWindowLong qui ne fonctionnait pas. Je castais en (long) le pointeur que jobtenais precedement avec GetWindowLong en (MaClasse *). Mais, comme SetWindowLong n'etais pas encore appele au moment du GetWindowLong, cela renvoyait 0, que je passais ensuite a SetWindowLong apres l'avoir caste en (long). Ce qui etait donc tres stupide.
Du coup j'ai mis mon SetWindowLong juste après le CreateWindowEx, en lui passant (long)this en troisieme parametres, et ca marche parfaitement.
C'etait tout a fait idiot comme probleme.
Merci beaucoup pour tes reponses. Thomas.
|
|
|
jeudi 1 juin 2006 à 22:43:18 |
Re : GetWindowLong, cast & méthodes virtuelles

MyXiLo
|
Oui en revanche ce qui est etrange cest que ca ne marchait pas uniquement pour les fonctions virtuelles...
|
|
|
jeudi 1 juin 2006 à 23:04:27 |
Re : GetWindowLong, cast & méthodes virtuelles

Zootella
|
Oui en revanche ce qui est etrange cest que ca ne marchait pas uniquement pour les fonctions virtuelles...
C'est logique, tu as appelé MaFonction avec this = NULL.
On peut appeler les fonctions d'une classe avec un pointeur NULL, seulement la classe ne doit pas avoir de variables membres.
Or pour gérer les fonctions virtuelles, le compliteur rajoute une variable membre caché, un pointeur sur la table virtuelle.
Quand tu appele MaFonction, ce pointeur est déréférencé, donc plantage.
|
|
|
vendredi 2 juin 2006 à 00:00:48 |
Re : GetWindowLong, cast & méthodes virtuelles

MyXiLo
|
Merci beaucoup pour cette precision. Thomas.
|
|
|
Cette discussion est classé dans : erreur, cast, mafonction, maclasse, getwindowlong
Répondre à ce message
Sujets en rapport avec ce message
[VS.NET] Une erreur de compilation incroyable! [ par Sunsawe ]
Bonjour, excusez moi mais je ne savais pas comment titrer mon message autrement. Voilà là fameuse erreur qui se suffit à elle même: Mesfunc.cpp(72) :
cast c++ [ par mnaulet ]
Bonjour,Est-il possible de supprimer les erreurs du compilateur sur les cast en c++.J'ai l'erreur suivante lors de l'appel à la fonction suivante :get
cast... [ par elpens ]
Bonjour,J'ai un souci de casting avec la fonction createProcess(...)J'ai un path en System:String, qui ne passe pas dans la fonction.J'ai également te
Erreur de LNK2001 [ par bikini42 ]
Bonjour à tous,J'ai un souci qui me bloque totalement, il concerne une erreur de compilation LNK2001 : unresolved external symbol Je ne vois pas comme
Probleme de compilation GCC please HELP :( [ par Booster ]
Bonjour à tous,Alors voilà j'ai le code suivant :cprodconso.h http://cpp.tastethepaste.org/1019cprodconso.cpp<a title
Erreur de syntaxe C++ [ par hisoka7 ]
Bonjour, J'ai une erreur de syntaxe (voir commentaire ci-dessous). Est ce quelqu'un peut m'expliquer pourquoi?
Blocage complet des Socket et autre E/S ..? [ par pdc_666 ]
Bonjour à tous,j'ai un gros soucis dans un programme que j'ai créé pour ma société. Pour faire simple c'est un Standard téléphonique à reconnaissance
Erreur [ par buguetj ]
Bonjour, je suis sous le développement d'une application C++ en interface MS-DOS (standard).J'ai tapé ceci: char choix1; while (cin>>choix1="
Récupération de l? erreur d?Internet Explorer (404) [ par Armandopoulos ]
Salut à tous, J´utilise cette fonction Navigate2 dans mon code pour charger une page html <b class="s1" style="fo
Erreur C1093 [ par fuego2002 ]
je suis entrain de travailler sur un logiciel de restauration rapide, je mon code marchait superbien sur un ordinateur, quand je l'ai copié sur un aut
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|