begin process at 2012 02 11 04:20:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

GetWindowLong, cast & méthodes virtuelles


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

GetWindowLong, cast & méthodes virtuelles

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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.

1 2

Cette discussion est classée 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,732 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales