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:
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.
Re: Différences avec Visual C++
Salut Kaitlyn
Citation:
Envoyé par
kaitlyn
Ces deux fonctions retournent un INT_PTR.
Selon Microsoft (copié de la doc Visual C) la déclaration de la première est
Code:
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:
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
Re: Différences avec Visual C++
Merci, Kaitlyn
Citation:
Envoyé par
kaitlyn
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.)
Citation:
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