IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

getwindowlong gwl_userdata et pointeurs


Sujet :

Windows

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut getwindowlong gwl_userdata et pointeurs
    Bonjour,

    ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // on attache un pointeur vers l'objet interfaceapplication au handle de la fenetre
      SetWindowLongA(m_fenetre_menu_hdl,GWL_USERDATA,(LONG)(this));
    me donne ce warning :
    warning C4311: 'type cast' : pointer truncation from 'InterfaceApplication *const ' to 'LONG'
    et celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // on recupere un pointeur vers l'objet InterfaceApplication grace au handle de la fenetre
      InterfaceApplication* iapp = (InterfaceApplication*) GetWindowLongA(hwnd,GWL_USERDATA);
    celui là :
    warning C4312: 'type cast' : conversion from 'LONG' to 'InterfaceApplication *' of greater size
    How can I get rid of these warnings ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu es censé utiliser SetWindowLongPtr(m_fenetre_menu_hdl, GWLP_USERDATA, reinterpret_cast< LONG_PTR >(this));

    Malheureusement, si tu ne compiles pas pour Win64, tu auras quand même le Warning car SetWindowLongPtr est juste un bète #define sur SetWindowLong.

    Dans ces circonstances, j'ai tendance à remplacer les #defines par des fonctions inline avec les bons types:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /* Définintions pour fonctions inline */
    #ifndef CCPP_INLINE
    #if defined(__cplusplus) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) || defined(__GNUC__)
    #define CCPP_INLINE inline
    #elif defined(_MSC_VER)
    #define CCPP_INLINE __inline
    #else
    #define CCPP_INLINE
    #endif
    #endif
    /* Définition pour cast: C ou C++ */
    #ifndef STATIC_CAST
    #ifdef __cplusplus
    #define STATIC_CAST(t, x) static_cast< t >(x)
    #else
    #define STATIC_CAST(t, x) ((t)(x))
    #endif
    #endif
     
    #ifdef GetWindowLongPtrW
    	//GetWindowLongPtr's are defines
    	#undef GetWindowLongPtrA
    	#undef GetWindowLongPtrW
    	#undef SetWindowLongPtrA
    	#undef SetWindowLongPtrW
     
    	static CCPP_INLINE LONG_PTR GetWindowLongPtrA(HWND hWnd, int nIndex)
    	{ return STATIC_CAST(LONG_PTR, GetWindowLongA(hWnd, nIndex)); }
    	static CCPP_INLINE LONG_PTR GetWindowLongPtrW(HWND hWnd, int nIndex)
    	{ return STATIC_CAST(LONG_PTR, GetWindowLongW(hWnd, nIndex)); }
     
    	static CCPP_INLINE LONG_PTR SetWindowLongPtrA(HWND hWnd, int nIndex, LONG_PTR lp)
    	{ return STATIC_CAST(LONG_PTR, SetWindowLongA( hWnd, nIndex, STATIC_CAST(LONG, lp) )); }
    	static CCPP_INLINE LONG_PTR SetWindowLongPtrW(HWND hWnd, int nIndex, LONG_PTR lp)
    	{ return STATIC_CAST(LONG_PTR, SetWindowLongW( hWnd, nIndex, STATIC_CAST(LONG, lp) )); }
     
    #endif
    Tu mets ce morceau de code dans un fichier d'en-tête à toi, que tu inclues dans tes sources, et tu pourras utiliser SetWindowLongPtr sans problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    ok merci

  4. #4
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Tiens ça faisait quelque temps que je me disais "va falloir faire quelque chose pour ces warnings, c'est quand même pas propre..."

    Et là, paf !

    La solution !

    Meci Medinoc.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    De rien, très cher.
    Et naturellement, ce morceau est aussi utilisable en C, pour peu qu'on choisisse correctement les defines...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo