Transmettre un pointeur avec SetWindowLong()

RTW Messages postés 36 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 février 2004 - 13 janv. 2004 à 18:53
RTW Messages postés 36 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 février 2004 - 13 janv. 2004 à 22:25
Je n'arrive pas bien à cerner l'utilisation de la valeur DWL_USER dans les fonctions SetWindowLong() et GetWindowLong().

Je m'explique, je voudrais envoyer une structure de cette manière :

// A un endroit quelconque du code
typedef struct MASTRUCTURE mastructure;
SendMessage( hwnd , WM_CREATE , 0 , (LPARAM)&mastructure );

// Dans la procédure de gestion des messages
case WM_CREATE:
     MASTRUCTURE *mastructure;
     mastructure = (MASTRUCTURE *)lParam;
     SetWindowLong( hwnd , DWL_USER , (LONG)lParam);

case OK:     // Le nom de la 'case' n'a aucune importance ici
     MASTRUCTURE *mastructure;
     mastructure = (MASTRUCTURE *)GetWindowLong( hwnd , DWL_USER );


Vous êtes toujours là ?

Je ne comprends pas les lignes suivantes :
     mastructure = (MASTRUCTURE *)lParam;
     SetWindowLong( hwnd , DWL_USER , (LONG)lParam);

Pourquoi transmettre une valeur non modifiée ?

Si une âme charitable pouvais éclairer ma lanterne sur le sujet, ce serais super sympa !
Merci d'avance ;p
A voir également:

4 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 janv. 2004 à 19:08
pourquoi tu veux envoyer toi même un message WM_CREATE à une fenêtre ?

ce message est envoyer automatiquement lors de la création de la fenêtre avec des paramètres spécifiques pour wParm t lParam :
=> si tu envoie autre chose il y a risque de plantage.

SetWindowLong avec DWL_USER et GWL_USER permet d'associer une valeur sur 32 bits ou un pointeur à un handle de fenêtre pour que dans la procédure de traitement de la fenêtre tu puisse les récupérées à partir du handle.

ex : une structure MASTRUCT continent des infos et données relatives à une fenêtre.

tu crée la fenêtre puis tu fait un SetWindowLong pour associer ta structure à la fenêtre

lors du traitement des messages (où n'importe où dans le code) si tu souhaite obtnenir des données , tu fait un GetWindowLong.

cette technique est surtout utilisée s'il y a plusieur fenêtre qui sont traitées par la même WndProc afin de pouvoir récupérer ses données propres.
S'il n'y a q'une seule fenêtre gérée par la WndProc, il suffit que les données soit accessible de façon globale.
0
RTW Messages postés 36 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 février 2004
13 janv. 2004 à 19:16
Merci pour ta réponse ymca2003.
Finalement je me compliquais la vie pour rien... ou pour tout faire planter !

Je vais donc me servir de tes remarques et je te ferais part de mes résultats.

...hum... disons dans 3 1/4 d'heure !

Bon appétit !
0
RTW Messages postés 36 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 février 2004
13 janv. 2004 à 20:59
Je n'y arrive pas... :sad)

J'ai beau essayer avec DWL_USER et GWL_USERDATA, c'est toujours sans succès.

Je déclare globalement la structure suivante :
typedef struct {
int i; // C'est juste pour le test !
} MASTRUCTURE , *LPMASTRUCTURE;

Je crée ma structure (globale) :
MASTRUCTURE mastructure;

Je crée ma fenêtre (dans une fonction) :
HWND hWnd = CreateWindowEx(...);

J'initialise la variable de ma structure :
mastructure.i = 9; // Par exemple

Je transmet la structure à la fenêtre :
SetWindowLong( hWnd , DWL_USER , (LONG)&mastructure );

Puis, dans la procédure de gestion des messages de ma fenêtre, je charge le pointeur de la structure transmise :
MASTRUCTURE *mastructure;
mastructure = (MASTRUCTURE *)GetWindowLong ( hwnd , DWL_USER );

Enfin, j'affiche une MessageBox (debug ;p) :
char Debug[1];
_itoa((int)&mastructure->i,(char*)Debug,10);
MessageBox(NULL,(LPCTSTR)Debug,"Debug",MB_OK);

Et là, normalement, un 9 devrais sortir.
Mais pas là ! C'est un 4 qui sort.

Y'aurait-il un rapport avec le nombre d'octets mis à disposition pour DWL_USER ?
Y'a-t-il une (des) erreur(s) de pointeur(s) ?

Là je sèche... mais je persévère !
0
RTW Messages postés 36 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 février 2004
13 janv. 2004 à 22:25
:big) Ça y'est !!! :big)
J'ai enfin réussi !

Tout d'abord, j'ai enlevé la structure globale : maintenant elle est locale.

Ensuite, c'était le déroulement du programme que j'avais mal évalué (mon "pas-à-pas était en fait dispatché sur plusieurs fonctions).

Et pour finir, il y avait bien des erreurs au niveau des pointeurs (dans les paramètres de mes fonctions).

C'est l'explication extrèmement simple de ymca2003 qui m'a mis la puce à l'oreille. Il faut bien connaître l'ordre d'appel des messages du système (entre autres).

Encore merci à ymca2003 (pour son aide ;) ), à Dev-C++ (et à son débogueur :) ) et à CPPFrance.Com (pour ce merveilleux site 8-) ).
0
Rejoignez-nous