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 :

DialogBox qui appelle une DialogBox


Sujet :

Windows

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 527
    Points : 215
    Points
    215
    Par défaut DialogBox qui appelle une DialogBox
    Bonjour,
    Dans mon appli je fais appel à une boite de dialogue dans laquelle je suis amené à rechercher des élément via une seconde boite de dialogue.
    Pour passer l'information j'utilise "SetWindowLong ()" mais au retour une fois récupéré par "GetWindowLong()", l'application plante.
    http://www.photosreflex.net/temp/erreur_visualc.jpg
    Pourtant j'affiche bien le bon resultat par MessageBox() ...
    Il a sûrement quelque chose ...
    Comment passer une structure d'un dialogue à un autre ...
    Si quelqu'un a une idée
    Merci d'avance
    DialogBox appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case BN_CLICKED:
                DialogBox(hInst, MAKEINTRESOURCE(Libpredef), hDlg, LibpredefDlgProc);
                lbpdef = (LIBPREDEF *)GetWindowLong(hDlg, DWL_USER);
    			strcpy(szBuffer, lbpdef->LibPredef);
    			MessageBox (hDlg, szBuffer, szAppName, MB_OK | MB_ICONEXCLAMATION);
                SetDlgItemText (hDlg, IDC_OBJET, szBuffer, strlen(szBuffer));
                break;
    DialogBox appelée :
    Code : 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
    BOOL CALLBACK LibpredefDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)
    {
    HGLOBAL hglb;
    LIBPREDEF *lbpdef;
    
         switch (message)
    	 {
           case WM_INITDIALOG:
                if (hglb = GlobalAlloc(GPTR,sizeof(LIBPREDEF))) {
    		       if (lbpdef = (LIBPREDEF *)GlobalLock(hglb)) {
                     SetWindowLong(GetParent(hDlg),DWL_USER,(LONG)lbpdef);
    				 lbpdef->hglb = hglb;
    			     strcpy(lbpdef->LibPredef, "Test transition de données");
                     return(0L);
    			   }
    			   GlobalFree(hglb);
    			 }
    		    return TRUE;
    
           case WM_COMMAND:
               switch (wParam)
    		   {
                 case IDOK :
                 case IDCANCEL :
    				   
                      EndDialog (hDlg, 0) ;
                      return TRUE ;
    		   }
               break ;
    	 }
         return FALSE ;
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Je ne sais pas si ça peut avoir un rapport avec ton problème, mais ta façon d'allouer de la mémoire est un peu douteuse :

    - GlobalAlloc (GPTR, ...) alloue un bloc de mémoire physique et l'initialise à 0 ; le retour est donc directement un pointeur sur la mémoire allouée et non un handle ;
    - pour la même raison GlobalLock() est inutile (et peut peut-être même mettre la zone, surtout s'il n'y a pas de GlobalUnlock() associé, mais je ne suis pas sûr) ;
    - les fonctions Globalxxx() ne sont pas tout à fait obsolètes dans Win32 ... mais presque :

    -> pour la gestion standard de la mémoire dynamique mieux vaut utiliser malloc()/free() en C, et new/delete en C++.
    -> pour une gestion plus spécifique et avancée du/des tas (heaps), des fonctions adaptées à Win32 existent, plus pratiques & beaucoup plus rapides : Heapxxx().
    -> toutefois, héritage technologique oblige, les fonctions Globalxxx() sont parfois nécessaires dans les domaines suivants : DDE, clipboard & OLE. Mais c'est vraiment tout.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 527
    Points : 215
    Points
    215
    Par défaut
    J'ai modifié l'allocation memoire que j'ai remplacé par "malloc()", mais le bug est toujours là, et toujours dans le dalogue 1 au retour du dialogue 2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BOOL CALLBACK LibpredefDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)
    {
    
         switch (message)
    	 {
           case WM_INITDIALOG:
    lbpdef = malloc (sizeof(LIBPREDEF));
    strcpy(lbpdef->LibPredef, "Test transition de données");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case BN_CLICKED:
                DialogBox(hInst, MAKEINTRESOURCE(Libpredef), hDlg, LibpredefDlgProc);
                lbpdef = (LIBPREDEF *)GetWindowLong(hDlg, DWL_USER);
                SetDlgItemText (hDlg, IDC_OBJET, "xxx", 3);
                return FALSE;
    Le bug se produit au moment du SetDlgItemText ()

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetDlgItemText (hDlg, IDC_OBJET, "xxx", 3);
    3 questions :

    1/ c'est quoi ce 4ème argument (3) ? SetDlgItemText() n'en prend que 3 il me semble.

    2/ est-ce que tu as vérifié que hDlg est valide ?

    3/ est-ce que tu as vérifié que IDC_OBJET correspondait bien à un controle fils valide ?

    4/ est-ce que tu as vérifié qu'il n'y avait pas un problème de réentrance dans le dialogue fils (en mettant un point d'arrêt dans WM_INITDIALOG par ex) ?

    Si tu as vérifié tout ça, que tout est OK et que ça plante toujours avec le même message d'erreur, c'est qu'à priori la pile est corrompue quelque part en amont.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 527
    Points : 215
    Points
    215
    Par défaut
    Citation Envoyé par rigobert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetDlgItemText (hDlg, IDC_OBJET, "xxx", 3);
    3 questions :

    1/ c'est quoi ce 4ème argument (3) ? SetDlgItemText() n'en prend que 3 il me semble.

    2/ est-ce que tu as vérifié que hDlg est valide ?

    3/ est-ce que tu as vérifié que IDC_OBJET correspondait bien à un controle fils valide ?

    4/ est-ce que tu as vérifié qu'il n'y avait pas un problème de réentrance dans le dialogue fils (en mettant un point d'arrêt dans WM_INITDIALOG par ex) ?

    Si tu as vérifié tout ça, que tout est OK et que ça plante toujours avec le même message d'erreur, c'est qu'à priori la pile est corrompue quelque part en amont.
    C'est vraiment la honte !!!
    C'est effectivement le 4 eme argument, que j'ai été chercher je ne sais où (enfin si, de la fonction inverse, le Get) de SetDlgItemText()
    Merci encore.

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

Discussions similaires

  1. servlet qui appelle une autre
    Par kam81 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 06/11/2006, 16h14
  2. Réponses: 2
    Dernier message: 19/10/2006, 15h29
  3. Page Html qui appel une function
    Par grimsk dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/09/2006, 20h01
  4. Connaitre le processus qui appelle une fonction API
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 28/05/2006, 13h56
  5. [PL/SQL] Trigger qui appelle une procédure
    Par alex6891 dans le forum Oracle
    Réponses: 5
    Dernier message: 19/01/2006, 09h01

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