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

Code::Blocks Discussion :

Différences avec Visual C++


Sujet :

Code::Blocks

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2024
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Différences avec Visual C++
    Bonjour
    Je suis en train de "porter" (oui, c'est souvent nécessaire...) un petit programme de Visual C++ à Code:Blocks utilisant GnuCC et MinGW.
    J'ai du code qui se compile sans aucune erreur dans le premier mais je n'arrive pas à le faire digérer par GnuCC.
    Voici juste le minimum essentiel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int CALLBACK doDialog( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
    ...
    WinMain()...
    {
      int choix;
    ...
      choix = DialogBox( hInst, MAKEINTRESOURCE( IDD_DIALOG1 ), NULL, doDialog );
    ...
    }
    Cela a toujours compilé et fonctionné parfaitement (depuis 2012, je l'utilise souvent) dans Visual Studio mais dans Code::Blocks le GnuCC refuse le cast: "conversion invalide" de doDialog().
    J'ai essayé (DLGPROC) explicitement, j'ai changé le type de doDialog() mais rien n'y fait.
    Plusieurs valeurs peuvent être retournées par doDialog() donc il ne peut pas être "bool" - mais même si je définis ainsi pour voir ça ne marche toujours pas.
    Seul changer la déclaration de DialogBox() dans winuser.h le fait passer... mais je n'aime pas faire ça (normalement " __MINGW_NAME_AW DialogBox( ..."). Ca revient à "long long int (*)" alors que dans VS tout était de 32 bits. Un rapport?

    Une idée? Merci d'avance.

  2. #2
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 622
    Points : 1 380
    Points
    1 380
    Par défaut
    Salut,

    Ces deux fonctions retournent un INT_PTR.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2024
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Re: Différences avec Visual C++
    Salut Kaitlyn

    Citation Envoyé par kaitlyn Voir le message
    Ces deux fonctions retournent un INT_PTR.
    Selon Microsoft (copié de la doc Visual C) la déclaration de la première est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int DialogBox(
      HINSTANCE hInstance,  // handle to application instance
      LPCTSTR lpTemplate,   // identifies dialog box template
      HWND hWndParent,      // handle to owner window
      DLGPROC lpDialogFunc  // pointer to dialog box procedure
    );
    Donc DialogBox retourne un int

    --------
    doDialog - son 4ième paramètre (une fonction définie par le programmeur) - est du type DLGPROC - un pointeur à une fonction BOOL CALLBACK
    (son nom seul - sans les '(' et ')' - est un pointeur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BOOL CALLBACK DialogProc(
      HWND hwndDlg,  // handle to dialog box
      UINT uMsg,     // message
      WPARAM wParam, // first message parameter
      LPARAM lParam  // second message parameter
    );
    Donc doDialog() (DialogProc) retourne un boolean (du moins zéro ou non-zéro).

    Cette fonction traite la commande reçue dans uMsg et Wparam (selon l'action de l'utilisateur), puis retourne une valeur non-zéro ou zéro (message traité ou pas).
    Elle retourne une valeur spécifique (un int) dans son appel à EndDialog(), qui devient la valeur retournée par dialogBox() - un int qui peut être utilisée dans un switch.

    --------
    J'ai l'impression que minGW a d'autres idées - mais que ça plaise ou pas c'est Microsoft seul qui peut définir les fonctions de Windows ;-)

    Cdlt, Christophe

  4. #4
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 622
    Points : 1 380
    Points
    1 380
    Par défaut
    C'est bien INT_PTR, c'est ce que dit la doc Microsoft :
    https://learn.microsoft.com/en-us/wi...ser-dialogboxw
    https://learn.microsoft.com/en-us/wi...ialogboxparamW
    https://learn.microsoft.com/en-us/wi...inuser-dlgproc

    Certainement ta version est trop ancienne, avant les systèmes 64bits.
    INT_PTR est un entier avec capacité d'adressage (capable de contenir un pointeur), ceci explique cela.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2024
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Re: Différences avec Visual C++
    Merci, Kaitlyn

    Citation Envoyé par kaitlyn Voir le message
    C'est bien INT_PTR, c'est ce que dit la doc Microsoft :
    ...
    Certainement ta version est trop ancienne, avant les systèmes 64bits.
    Eh oui, tu as raison: c'est celle que j'ai eue depuis 1998.
    (J'ai installé la dernière version de VS mais j'ai vite viré cette gigantesque usine à gaz en faveur de Code::Blocks.)

    INT_PTR est un entier avec capacité d'adressage (capable de contenir un pointeur), ceci explique cela.
    OK, alors ça compile, mais ne marche plus.
    Je dois modifier le code pour tenir compte des changements. Ainsi que la définition de ma boîte de dialog.
    Ou retourner à mon VC sur une autre machine sous XP ;-)

    En passant à Win 11 j'étais content (et surpris) de découvrir que tous mes petits outils faits pour '95, '98 et XP marchent toujours - sans rien faire.
    Même ceux qui plongent dans le système (p. ex. en installant des hooks). Seuls certaines parties de la BDR ont changés.

    Bonne journée
    Cdlt

  6. #6
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 622
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par bitwyse Voir le message
    Ou retourner à mon VC sur une autre machine sous XP
    Ou tout en restant sur ton Windows 11, utiliser (entre autre possibilités) l'option -m32 de GCC.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2024
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Ou tout en restant sur ton Windows 11, utiliser (entre autre possibilités) l'option -m32 de GCC.
    Merci, Kaitlyn. En fait j'avais déjà essayé ça (mais en cochant l'option du compiler "target x86 32bit") mais ça ne change pas la déclaration de doDialog()
    Ce n'est pas clair, parce que si je mets le curseur sur "dialogBox" il affiche "___MINGW_NAME_AW(dialogBox )" et non pas "INT_PTR"
    Puisque "___MINGW_NAME_AW" n'est pas défini dans un ".h" dans le dossier des "include" (je l'avais cherché) ça ne m'avait pas aidé.

    Aussi, "INT_PTR" est un peu égarant, car ce n'est pas un (int *) - comme le nom le laisse supposer - mais un "long long int" (qui peut être un pointeur).

    Cdlt, Christophe

  8. #8
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 045
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 045
    Points : 8 256
    Points
    8 256
    Par défaut
    J'ai testé la compilation d'une simple boîte de dialogue comme tu décris avec Code:Blocks (MinGW_64 plusieurs versions) ça compile sans soucis (en C), avec n'importe quel type de retour pour la callback (BOOL, int, INT_PTR) . Et aussi bien en 32 bits qu'en 64 bits. J'ai même testé avec un ancien MinGW.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2024
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par CGi Voir le message
    J'ai testé la compilation d'une simple boîte de dialogue comme tu décris avec Code:Blocks (MinGW_64 plusieurs versions) ça compile sans soucis (en C), avec n'importe quel type de retour pour la callback (BOOL, int, INT_PTR) . Et aussi bien en 32 bits qu'en 64 bits. J'ai même testé avec un ancien MinGW.
    Comme je l'ai déjà dit je n'ai plus de problème avec la compilation avec INT_PTR. Mais si je remets int il me dit tout de suite
    "invalid conversion from 'int (*)(HWND, UINT, WPARAM, LPARAM)' to 'DLGPROC' ...^do_Dialog"
    - et il n'a pas tort.

    Pourquoi ? Ce n'est pas toi qui traite la valeur de retour de la callback ?
    Non. C'est dialogBox() en recevant la valeur passée à EndDialog() par doDialog().
    Ensuite j'obtiens la valeur à partir d'elle.
    Puis je traite la valeur avec un switch ( choix )... où choix est un int pouvant avoir plusieurs valeurs selon le choix de l'utilisateur - pas uniquement true ou false.

Discussions similaires

  1. [VB.NET] Création de control avec visual studio
    Par HULK dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/08/2007, 18h06
  2. Probleme d'utilisation de directX 9 avec visual studio.net
    Par cranedoeuf dans le forum DirectX
    Réponses: 1
    Dernier message: 24/05/2004, 04h33
  3. travail en parralèlle avec Visual C++ 6.0
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 07/04/2004, 12h44
  4. Réponses: 12
    Dernier message: 02/02/2004, 13h41
  5. Comment attaquer Mysql avec Visual C++
    Par brisou_ dans le forum Administration
    Réponses: 4
    Dernier message: 11/03/2003, 13h12

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