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 :

Sendmessage() warning: passing arg 1 of `SendMessageA' from incompatible pointer type


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut Sendmessage() warning: passing arg 1 of `SendMessageA' from incompatible pointer type
    Je code sous Code::Blocks.

    Je lance la boîte de dialogue principale de mon programme grâce à l 'instruction suivante :SendMessage(hInstance,WM_SETICON,(WPARAM)ICON_SMALL,(LPARAM)500).

    Tout fonctionne parfaitement mais j'ai un warning de CB : warning: passing arg 1 of `SendMessageA' from incompatible pointer type. J'aimerais corriger mon texte pour éviter ce warning...

    Je n'ai rien trouvé sur Google, quelqu'un peut-il m'aider ?

    Merci d'avance,

    hologram
    .oO°^°Oo.

  2. #2
    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
    Bin s'il y a un warning c'est que tout ne fonctionne pas parfaitement .

    1. SendMessage sert à envoyer un message à une fenêtre. Le premier argument requis par cette fonction est le handle de la fenêtre à lquelle on veut envoyer un message. Qu'est-ce donc ce hInstance ... ?

    2. WM_SETICON est le message qu'il faut envoyer pour changer l'icône associée à une fenêtre. Lorsqu'on on envoie ce message, il faut mettre ICON_BIG ou ICON_SMALL dans wParam selon qu'on veut changer le "BIG ICON" ou le "SMALL ICON". BIG ICON est l'icône affichée par Windows lorsqu'on appuie sur ALT + TAB et SMALL ICON celle que Windows affiche dans la barre de titre de la fenêtre. Puis dans lParam, il faut mettre le handle de l'icône. Donc le (LPARAM)500, c'est pas bien du tout. 500 est le handle d'une icône ?

    3. Je sais tout cela car j'ai cherché sur Google .

    WM_SETICON Message

  3. #3
    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
    Citation Envoyé par hologram
    Je lance la boîte de dialogue principale de mon programme grâce à l'instruction suivante : SendMessage(hInstance,WM_SETICON,(WPARAM)ICON_SMALL,(LPARAM)500).
    Euh ... non c'est pas cette instruction qui lance la boîte de dialogue. C'est DialogBox ou CreateDialog. Utilise DialogBox.

  4. #4
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Bon, visiblement mon morceau de code n'était pas suffisant et j'ai dit une connerie c'est pas cette instruction qui lance la dialogbox . Cette instruction vient en complément et génère le placement de l'icône sur la boîte de dialogue.

    Voici l'instruction qui lance la dialogbox :
    DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)DlgProc);

    Je programme ensuite l'instruction qui génère l'icône et qui donne le message d'erreur :
    SendMessage(hInstance,WM_SETICON,(WPARAM)ICON_SMALL,(LPARAM)500);

    Le paramètre (LPARAM)500 correspond à un define du resource.h. Ceci dit tout fonctionne correctement, ... , je cherche à améliorer le texte et à comprendre les erreurs.

    Le restant je l'ai aussi trouvé sur google.

    hologram

  5. #5
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Bon j'ai déplacé l'initialisation des icônes dans le case WM_INITDIALOG , avec les instructions suivantes et je n'ai plus mon message d'erreur. Et ça fonctionne. Est-ce plus propre comme ça ?

    hIcon=LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_ICON));
    SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
    SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);

    hDlg = le handle de la Dlgbox.

    hologram

  6. #6
    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
    Bon j'ai déplacé l'initialisation des icônes dans le case WM_INITDIALOG , avec les instructions suivantes et je n'ai plus mon message d'erreur. Et ça fonctionne. Est-ce plus propre comme ça ?

    hIcon=LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_ICON));
    SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
    SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);

    hDlg = le handle de la Dlgbox.
    Pas que c'est plus propre (ce qui insinuerait que l'autre version était propre d'une quelconque manière ), c'est ENFIN propre. hInstance n'est pas un handle d'une boîte de dialogue, tu espérais quel résultat ? 500 (DLG_ICON je suppose) n'est pas le handle d'une icône, mais l'id d'une icône en ressource. Il faut appeler LoadIcon par exemple pour avoir un handle vers cette icône. Bonne continuation .

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    La seule chose peu propre ici, c'est le fait que tu utilises le même handle d'icône pour régler les deux versions de l'icône de la boîte de dialogue (pour ça, il faudrait deux appels à LoadImage() en spécifiant les deux tailles). Ah, et le fait que tu ne mémorises pas l'ancien handle pour restaurer à la fin et supprimer l'icône.

    Par contre, il y a une partie très sale dans la création de ta boîte de dialogue: Tu fais un cast explicite sur le pointeur de fonction. Supprime ce cast et corrige l'erreur en corrigeant le prototype de la fonction.

  8. #8
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Je ne comprend le cast explicit ? Je n'ai fait que suivre le tutoriel de CGI (http://chgi.developpez.com/windows/dialogue)

    Voici l'appel qui y renseigné :
    DialogBox(hinst, "DIALOG1" , hwnd, (DLGPROC)Dialog1Proc);
    Voici le mien :
    DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)DlgProc);
    le 2ème handle est mis à NULL parce qu'il n'y a pas de parent.

    La déclaration de fonction du tuto :
    BOOL APIENTRY Dialog1Proc(HWND, UINT, WPARAM, LPARAM);
    Ma déclaration :
    BOOL APIENTRY DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);

    Ceci dit si on peut faire mieux ...

    hologram

  9. #9
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Bon ben j'ai lu les tutoriaux de melem et j'y ai vu qu'au lieu de prendre le type BOOL APIENTRY, les DlgBx prennent un type INT_PTR...

    Je suppose que c'est de ça que tu voulais parler Médinoc ? Ceci dit j'y avais pensé en lisant la doc msdn, mais là ils déclarent les DlgBx sous les 2 types en question...

    Et quelle est la différence entre les deux, le retour est le même (TRUE, FALSE) ?

    Concernant l'association des icônes, voici ce que j'ai mis dans le WM_INITDIALOG :

    hIconB=LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_ICON));
    hIconS=LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_ICON));
    SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconS);
    SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIconB);

    hologram

  10. #10
    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
    BOOL était utilisé dans les anciennes versions de Windows mais maintenant c'est le type INT_PTR qui l'est (demande à MS pourquoi ). La règle est la même, on retourne quand TRUE on a traité un message et FALSE dans le cas contraire. Concernant l'association des icônes, le code est bon.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Melem Voir le message
    (demande à MS pourquoi ).
    Je connais la réponse, mais elle mène sur une autre question: Certains messages attendent de la boîte de dialogue qu'elle retourne directement son résultat casté en BOOL, plutôt que passer par SetWindowLongPtr(DWL_MSGRESULT) (notamment les WM_CTLCOLORxxx). Et comme ces valeurs de retour peuvent être des handles, il fallait un type pouvant contenir un pointeur sous Win64, d'où INT_PTR.
    La question à laquelle ça mène, c'est bien sur: Pourquoi une telle entorse au traitement normal des messages?

    PS: Comme indiqué dans le lien de ma signature, si tu castes un pointeur de fonction, c'est que ça cache une autre erreur. Donc, autant que possible, il faut éviter de tels casts.
    En C++, la règle est un peu plus relaxée, due à la présence des casts C++ plus restrictifs.

    PPS: Il va falloir prévenir CGi que sont tutoriel comporte une erreur...

  12. #12
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Petit complément d'information je code sous Code::Blocks avec MINGW (GNU GCC Compiler)

    Je reviens sur la question de la fonction DlgBx

    Si je lance comme ceci :
    DialogBox(hInstance,"DIALOG1",NULL,DlgProc);
    Le compilateur donne un warning :
    warning: passing arg 4 of `DialogBoxParamA' from incompatible pointer type.

    Par contre DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)DlgProc);
    passe sans encombre ??

    hologram

  13. #13
    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
    Citation Envoyé par Médinoc
    Je connais la réponse ...
    Tu bosses chez MS ? Ah je savais pas qu'on pouvait qu'on pouvait retourner autre chose que TRUE / FALSE dans une DlgProc. Bin c'est de là que vient le problème alors. Mais personnellement, j'aime bien le modèle BOOL (TRUE ou FALSE seulement) comme type de retour et DWL_MSGRESULT pour les informations additionnels s'il y en a suffisant. Je ne vois pas non plus pourquoi avoir compliqué les choses.

    Si je lance comme ceci :

    DialogBox(hInstance, "DIALOG1", NULL, DlgProc);

    Le compilateur donne un warning :

    warning: passing arg 4 of `DialogBoxParamA' from incompatible pointer type.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INT_PTR WINAPI DlgProc(...);
    Si t'as un problème avec cela, c'est que ton compilateur utilise encore l'ancien prototype. Tu utilises MinGW 1.0 ? Change alors le prototype en (ancien prototype ...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOL WINAPI DlgProc(...);
    Mais en aucun cas on caste un pointeur de fonction. De tous les cats possibles, c'est celui-là qui est le plus mauvais.

  14. #14
    Membre du Club
    Profil pro
    Responsable administratif
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Je ne sais pas quelle version de mingw est utilisée mais c'est code::blocks 8.02.

    Avec INT_PTR CALLBACK, comme dans le tuto de Melem ça fonctionne. Avec INT_PTR WINAPI aussi. Y a-t'il un meilleur choix que l'autre ?

    Par contre j'avais pris la déclaration indiquée sur MSDN INT_PTR, et là j'étais obligé de caster.

    Merci à tous les deux,


    hologram

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Une DialogProc est ce qu'on appelle "une fonction callback", donc tu sais quel est le meilleur choix...

    Par contre j'avais pris la déclaration indiquée sur MSDN INT_PTR, et là j'étais obligé de caster.
    http://msdn.microsoft.com/en-us/libr...69(VS.85).aspx

  16. #16
    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
    CALLBACK est la convention d'appel utilisée par les fonctions "callbacks" (fonctions que l'on spécifie dans le programme mais que l'on n'appelle jamais soi-même (WndProcs, DlgProcs, etc.)) sous Windows. A l'heure actuelle, c'est la même que celle qui est utilisée par les fonctions de l'API Windows qui n'est autre que WINAPI.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Warning: Call-time pass-by-reference has been deprecated
    Par Poseidon62 dans le forum Langage
    Réponses: 8
    Dernier message: 16/10/2011, 16h03
  2. Réponses: 2
    Dernier message: 02/04/2010, 12h44
  3. Réponses: 4
    Dernier message: 15/08/2007, 16h47
  4. Réponses: 9
    Dernier message: 21/10/2006, 13h38
  5. Warning lors du this passé dans un constructeur
    Par NicolasJolet dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2006, 09h43

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