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 :

Paramètres de PostMessage et pointeur void ?


Sujet :

Windows

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut Paramètres de PostMessage et pointeur void ?
    Bonjour,

    Pour des raison compliqué j'ai un programme qui
    doit passer un pointeur this à une dll laquelle
    retourne ce pointeur au programme après certaines opérations.

    Le pointeur est passé à la dll comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void *pVoid = (void*)this;
    et retourné par cette même dll via PostMessage comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PostMessage(hWnd, MY_MSG, (WPARAM)pVoid, 0);
    ou encore comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PostMessage(hWnd, MY_MSG, 0, (LPARAM)pVoid);
    mais il semble que le pointeur void ne soit pas correctement retourné
    car le programme plante lors de son utilisation.

    Je n'ai pas bien compris à quoi correspondent exactement
    les types WPARAM et LPARAM de Windows.
    Y a t-il un moyen de passer correctement un pointeur void via
    ces 2 paramètres ?

    Merci.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Le pointeur est une valeur numérique. Si tu debuges la dll et l'application, le pointeur retourné doit avoir la même valeur numérique que celui de la dll (adresse mémoire).

    Par contre, pour des raisons de "stack" (allocation sur le tas, la pile ou dans le contexte de la dll), tu peux avoir des complications à l'utilisation de ce pointeur. Il faut bien se renseigner, personnellement j'ai eu des problèmes avec des allocations mémoires de la STL dans une dll COM...

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Un complément d'info.

    A l'origine (Windows 3.1) WPARAM était un Word param (donc sur 2 octets) et LPARAM était un Long param (donc 4 octets).

    Leur noms sont restés mais leur largeur s'est agrandie avec le temps (mais il est toujours interdit de dire que WPARAM fait 4 octets même si c'est vrai). Je pense aussi que sur les archi 64 bits, la taille de LPARAM est plus grande (8 octets) justement pour pouvoir mettre un pointeur. Quelqu'un peu confirmer ?

    Si tu as un pointeur à passer dans PostMessage() ou SendMessage(), il doit être passé avec le paramètre LPARAM (et certainement pas avec le paramètre WPARAM même si cela marche)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Ok, merci pour ces infos.

    Je passe donc maintenant mon pointeur this comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LPARAM pThis = (LPARAM)this;
    J'espère que j'aurai pas de mauvaise surprise...

  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 518
    Points
    41 518
    Par défaut
    WPARAM et LPARAM sont les types UINT_PTR et LONG_PTR respectivement.

    Et il n'est pas interdit de dire que WPARAM fait 32 bits, puisque:
    • Je l'ai lu dit explicitement sur MSDN (même si je ne le vois plus)
    • On utilise LOWORD et HIWORD sur LPARAM dans le traitement de messages comme WM_COMMAND.

    PS: En C++, on utilise reinterpret_cast quand on est poli.
    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.

  6. #6
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    PS: En C++, on utilise reinterpret_cast quand on est poli.
    Pardonnez ma grossièreté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LPARAM pThis = reinterpret_cast<LPARAM>(this);

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    WPARAM et LPARAM sont les types UINT_PTR et LONG_PTR respectivement.
    Donc sur une archi 64 bits, sizeof(WPARAM) et sizeof(LPARAM) font 8 octets puisque ce sont des pointeurs sur respectivement UINT et LONG (j'ai pas la possibilité de tester)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    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 518
    Points
    41 518
    Par défaut
    Non, il font 8 octets car se sont respectivement un type pouvant aussi bien contenir un UINT qu'un pointeur et un type pouvant aussi bien contenir un LONG qu'un pointeur.
    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.

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    WPARAM et LPARAM sont définis comme étant UINT_PTR et LONG_PTR qui font tous 32 bits sur un processeur 32 bits et 64 bits sur un processeur 64 bits : Windows Data Types

    LOWORD et HIWORD retournent respectivement le mot (un mot = 16 bits) de poids le plus faible et le mot suivant d'une valeur supérieure ou égale à 32 bits (même si MSDN ne la documente pas ainsi).

    On peut passer un pointeur à une DLL (mais pas à un autre exe) puisqu'une DLL est toujours "mappée" dans l'espace d'adressage du processus qui l'a appelée.

Discussions similaires

  1. Pointeur, void ?
    Par Erast dans le forum Débuter
    Réponses: 6
    Dernier message: 16/04/2010, 00h33
  2. Réponses: 4
    Dernier message: 04/02/2009, 16h08
  3. Pointeur void *
    Par coberle dans le forum C++
    Réponses: 7
    Dernier message: 12/12/2008, 20h11
  4. tableau de pointeurs void
    Par CerbeRGD dans le forum Débuter
    Réponses: 10
    Dernier message: 15/02/2008, 18h38
  5. Pointeur void *
    Par Atharendil dans le forum C
    Réponses: 6
    Dernier message: 04/05/2006, 09h53

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