begin process at 2012 05 30 18:45:41
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Transmettre un pointeur avec SetWindowLong()


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

Transmettre un pointeur avec SetWindowLong()

mardi 13 janvier 2004 à 18:53:29 | Transmettre un pointeur avec SetWindowLong()

RTW


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
mardi 13 janvier 2004 à 19:08:33 | Re : Transmettre un pointeur avec SetWindowLong()

ymca2003

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.
mardi 13 janvier 2004 à 19:16:21 | Re : Transmettre un pointeur avec SetWindowLong()

RTW


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 !
mardi 13 janvier 2004 à 20:59:27 | Re : Transmettre un pointeur avec SetWindowLong()

RTW


Je n'y arrive pas...

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 !
mardi 13 janvier 2004 à 22:25:14 | Re : Transmettre un pointeur avec SetWindowLong()

RTW


Ça y'est !!!
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 ).


Cette discussion est classée dans : code, mastructure, setwindowlong, lparam, dwl


Répondre à ce message

Sujets en rapport avec ce message

[HOOK]Encore le meme probleme.. [ par bdkiller ] Salut,Bon, après pas mal d'heures passés là-dessus, j'ai la DLL qui se compile sans erreurs, l'appli principale qui se compile sans erreurs également! Combo des touches dans un Hook [ par bdkiller ] Salut,encore moi avec les Hooks xDJ'arrive à mettre les hook en place, ca marche, sauf que je sais pas comment faire pour intercepter la combinaison d Hook messages de windows [ par deck_bsd ] Bonjour a tous,Voila je suis sur le point de finir mon 1er hook, mais voila , il ne fonctionne que une fois. Il intercepte une fois le message voulu ( erreur code 0x c0000005 [ par poohzu ] bonjour,je suis débutant en C et j'utilise Lcc.j'ai un programme qui contien des fichiers source et et des Header file;j'aimerais bien le compiler.mai compilation du code source c sous windows [ par LENOX8 ] Bonjour, J'ai recupere le code source de gaim 2.0 sous source forge qui est en c avec des makefiles et je voudrai compiler cette version sous windows analyseur code pour dépassement mémoire [ par adrienj ] Bonjour à tous,j'utilise Splint pour analyser mon code C et je souhaite que le résultat de l'analyse me dise les failles de gestion mémoire du genre ( Affichage d'un tableau avec du texte oblique [ par Titeuf007 ] Bonjour à tous,Je cherche à afficher un tableau (dans un CFormView) dont l'intitulé des colonnes est écrit de façon oblique (du style excel, avec les Executer du code d'un fichier exterieur [ par un4given ] Bonjour!Je possède aujourd'hui un programme principal dans lequel je colle du code C écrit dans un autre fichier a l'aide d'un script Matlab. Le fait Vous codez quoi? [ par SAKingdom ] Salut. Alors étant donnée qu'il ne se passe pratiquement rien sur cppfrance depuis quelque temps, je lance un petit sondage comme ça pour avoir un pro statut code indicated an error [ par poohzu ] Bonjour , je veux piloter un appareil via un programme écrit en C, lorsque je lui envoie des données , le programme me confirme que les donées ont


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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 : 3,167 sec (3)

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