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

Visual C++ Discussion :

GetDlgItem return NULL pointer


Sujet :

Visual C++

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut GetDlgItem return NULL pointer
    Bonjour,
    lors de l'utlisation de la fonction GetDlgItem
    dans mon code source,il n'y a pas de probléme lors de la compilation
    mais lors de l'éxécution l'application crash avec un message d'erreur :
    (MFC42D.DLL) : 0xC0000005 : Access violation
    la ligne de source utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetDlgItem(IDC_MODIF_MENSUEL)->ShowWindow(FALSE);
    merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour et bienvenu,
    Question de base : S'agit-il du bon ID? As-tu bien un tel contrôle dans ta boîte de dialogue?
    Si oui, à quel moment fait-tu cet appel? Dans le OnInitDialog, avant ou après?

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    S'agit-il du bon ID?
    #define IDC_MODIF_MENSUEL 1761

    As-tu bien un tel contrôle dans ta boîte de dialogue?
    oui,ça marche pour l'appel juste avant:
    GetDlgItem(IDC_AFF_MENSUEL)->ShowWindow(FALSE);
    qui a pour ID:
    #define IDC_AFF_MENSUEL 1713

    Si oui, à quel moment fait-tu cet appel?
    -je l'utilise Dans le corps de ma méthode OnInitDialog() surchargée aprés avoir appeller CDialog::OnInitDialog().

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    si GetDlgItem renvoi null c'est que le contrôle désigné n'existe pas dans la fenêtre.
    vérifie ta fenêtre et l'identifiant attaché à ce contrôle.

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    salut,
    en faite c'est lors du passage dans la méthode doModal()
    il n'arrive pas à créer un dialog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	// create modeless dialog
    	AfxHookWindowCreate(this);
    	if (CreateDlgIndirect(lpDialogTemplate,
    		CWnd::FromHandle(hWndParent), hInst))
    		{
    		---- 
    		}
    et il passe par l'assertion lors de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    BOOL CWnd::ShowWindow(int nCmdShow)
    {
    	ASSERT(::IsWindow(m_hWnd));
    
    	if (m_pCtrlSite == NULL)
    		return ::ShowWindow(m_hWnd, nCmdShow);
    	else
    		return m_pCtrlSite->ShowWindow(nCmdShow);
    }
    ci-joint la pile si ça peux aider:
    CWnd::ShowWindow(int 0) line 301 + 3 bytes
    CDlgCalendrierDechargement::CacheTousCtrl() line 197
    CDlgCalendrierDechargement::OnInitDialog() line 240
    AfxDlgProc(HWND__ * 0x000808bc, unsigned int 272, unsigned int 329940, unsigned int 329940) line 35 + 14 bytes
    USER32! 77d48709()
    USER32! 77d54ca6()
    USER32! 77d54af2()
    USER32! 77d575bf()
    USER32! 77d48709()
    USER32! 77d487eb()
    USER32! 77d4c00e()
    USER32! 77d4e366()
    CWnd:: DefWindowProcA(unsigned int 272, unsigned int 329940, long 0) line 1000 + 32 bytes
    CWnd:: Default() line 249
    CDialog::HandleInitDialog(unsigned int 329940, unsigned int 329940) line 621 + 8 bytes
    CWnd::OnWndMsg(unsigned int 272, unsigned int 329940, long 0, long * 0x0012e5d8) line 1815 + 17 bytes
    CWnd::WindowProc(unsigned int 272, unsigned int 329940, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x0012ebfc {CDlgCalendrierDechargement hWnd=0x000808bc}, HWND__ * 0x000808bc, unsigned int 272, unsigned int 329940, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000808bc, unsigned int 272, unsigned int 329940, long 0) line 368
    AfxWndProcBase(HWND__ * 0x000808bc, unsigned int 272, unsigned int 329940, long 0) line 220 + 21 bytes
    USER32! 77d48709()
    USER32! 77d487eb()
    USER32! 77d4b743()
    USER32! 77d558ef()
    USER32! 77d6ec20()
    USER32! 77d5fd5c()
    CWnd::CreateDlgIndirect(const DLGTEMPLATE * 0x00575290, CWnd * 0x0012f4f0 {CConfTraitement hWnd=???}, HINSTANCE__ * 0x00400000) line 327 + 36 bytes
    CDialog:: DoModal() line 528 + 32 bytes
    CPropConfDechargementAuto::OnModifier() line 313 + 11 bytes
    _AfxDispatchCmdMsg(CCmdTarget * 0x0012f57c {CPropConfDechargementAuto hWnd=0x001d0846}, unsigned int 1834, int 0, void (void)* 0x00402f9f CPropConfDechargementAuto::OnModifier(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 1834, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CDialog::OnCmdMsg(unsigned int 1834, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
    CWnd::OnCommand(unsigned int 1834, long 657526) line 2088
    CWnd::OnWndMsg(unsigned int 273, unsigned int 1834, long 657526, long * 0x0012ef90) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 1834, long 657526) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x0012f57c {CPropConfDechargementAuto hWnd=0x001d0846}, HWND__ * 0x001d0846, unsigned int 273, unsigned int 1834, long 657526) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x001d0846, unsigned int 273, unsigned int 1834, long 657526) line 368
    AfxWndProcBase(HWND__ * 0x001d0846, unsigned int 273, unsigned int 1834, long 657526) line 220 + 21 bytes
    USER32! 77d48709()
    USER32! 77d487eb()
    USER32! 77d4b743()
    USER32! 77d4b7ab()
    USER32! 77d7fc9d()
    USER32! 77d76530()
    USER32! 77d58386()
    USER32! 77d5887a()
    USER32! 77d48709()
    USER32! 77d487eb()
    USER32! 77d489a5()
    USER32! 77d489e8()
    USER32! 77d6e819()
    USER32! 77d65ce2()
    CWnd::IsDialogMessageA(tagMSG * 0x005687b0 {msg=0x00000202 wp=0x00000000 lp=0x0011002a}) line 182
    CWnd:: PreTranslateInput(tagMSG * 0x005687b0 {msg=0x00000202 wp=0x00000000 lp=0x0011002a}) line 3424
    CPropertySheet:: PreTranslateMessage(tagMSG * 0x005687b0 {msg=0x00000202 wp=0x00000000 lp=0x0011002a}) line 691
    CWnd::WalkPreTranslateTree(HWND__ * 0x00140738, tagMSG * 0x005687b0 {msg=0x00000202 wp=0x00000000 lp=0x0011002a}) line 2667 + 18 bytes
    CWinThread:: PreTranslateMessage(tagMSG * 0x005687b0 {msg=0x00000202 wp=0x00000000 lp=0x0011002a}) line 665 + 18 bytes
    CWinThread:: PumpMessage() line 841 + 30 bytes
    CWnd::RunModalLoop(unsigned long 4) line 3478 + 19 bytes
    CPropertySheet:: DoModal() line 827 + 12 bytes
    CEtlDoc::OnConfigurationTraitementsAuto() line 901
    _AfxDispatchCmdMsg(CCmdTarget * 0x00928600 {CEtlDoc}, unsigned int 56043, int 0, void (void)* 0x004020a4 CEtlDoc::OnConfigurationTraitementsAuto(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 56043, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CDocument::OnCmdMsg(unsigned int 56043, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 894 + 24 bytes
    CView::OnCmdMsg(unsigned int 56043, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 167 + 33 bytes
    CFrameWnd::OnCmdMsg(unsigned int 56043, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 890 + 33 bytes
    CWnd::OnCommand(unsigned int 56043, long 0) line 2088
    CFrameWnd::OnCommand(unsigned int 56043, long 0) line 317
    CWnd::OnWndMsg(unsigned int 273, unsigned int 56043, long 0, long * 0x0012fcc4) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 56043, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x009282c0 {CETLSplitter hWnd=???}, HWND__ * 0x00140738, unsigned int 273, unsigned int 56043, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x00140738, unsigned int 273, unsigned int 56043, long 0) line 368
    AfxWndProcBase(HWND__ * 0x00140738, unsigned int 273, unsigned int 56043, long 0) line 220 + 21 bytes
    USER32! 77d48709()
    USER32! 77d487eb()
    USER32! 77d489a5()
    USER32! 77d4bccc()
    CWinThread:: PumpMessage() line 846
    CWinThread::Run() line 480 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141eff, int 1) line 49 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141eff, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 7c816fd7()

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    en faite le crash vient du faite que hWnd que retourne la fonction FromHandle(m_hWnd) est NULL. dans quel cas peux-t-on avoir ça ?

    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
    CWnd* CWnd::GetDlgItem(int nID) const
    {
    	ASSERT(::IsWindow(m_hWnd));
    
    	if (m_pCtrlCont == NULL)
    		return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    	else
    		return m_pCtrlCont->GetDlgItem(nID);
    }
    
    void CWnd::GetDlgItem(int nID, HWND* phWnd) const
    {
    	ASSERT(::IsWindow(m_hWnd));
    	ASSERT(phWnd != NULL);
    
    	if (m_pCtrlCont == NULL)
    		*phWnd = ::GetDlgItem(m_hWnd, nID);
    	else
    		m_pCtrlCont->GetDlgItem(nID, phWnd);
    }

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par karim2009 Voir le message
    en faite le crash vient du faite que hWnd que retourne la fonction FromHandle(m_hWnd) est NULL. dans quel cas peux-t-on avoir ça ?
    Parceque m_hWnd est invalide. C'est en général lié au fait que le contrôle n'a pas été créé dans la boîte de dialogue.
    Si tu mets un GetLastError à la suite de ton GetDlgItem, qu'es-tu comme erreur?

    Enfin, peux-tu fournir toute la classe CDlgCalendrierDechargement et le .rc correspondant?

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Parceque m_hWnd est invalide. C'est en général lié au fait que le contrôle n'a pas été créé dans la boîte de dialogue.
    Si tu mets un GetLastError à la suite de ton GetDlgItem, qu'es-tu comme erreur?
    ==>l'erreur qu'on reçoit avec GetLastError à la suite du GetDlgItem est égal à 0.

    ci-joint les fichiers demandés:la classe CDlgCalendrierDechargement et le .rc correspondant.
    Fichiers attachés Fichiers attachés

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Dans le zip, il manque le .h correspondant. Le .rc ne contient pas la définition de la boîte de dialogue. C'est celui qui la contient qu'il me faudrait.
    A priori, je ne vois pas d'où cela peut venir sans plus d'info.
    Précisons, c'est lequel qui ne fonctionne pas ?GetDlgItem(IDC_MODIF_MENSUEL)->ShowWindow(TRUE); dans CDlgCalendrierDechargement::OnMensuel() ou dans CDlgCalendrierDechargement::CacheTousCtrl()?

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    je t'envoie les bonnes fichiers.

    c'est celui dans CDlgCalendrierDechargement::CacheTousCtrl()
    qui ne fonctionne pas car je crois que c'est lui qui est appelé en premier
    lieu durant OnInitDialog()
    GetDlgItem(IDC_MODIF_MENSUEL)->ShowWindow(FALSE)

    merci d'avance
    Fichiers attachés Fichiers attachés

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    A priori, je vois pas trop comme ça. Donc on va tenter d'autres pistes :
    -> Ta boîte de dialogue est dans l'exe ou dans une DLL?
    -> As-tu vérifier que tu n'avais pas de conflit d'ID : IDC_MODIF_MENSUEL est bien unique?
    -> Es-tu en configuration multi-thread? Le lancement de la boîte de dialogue se fait-il dans le thread principal?
    J'avoue qu'en relisant le code, je ne vois pas trop pourquoi cela échoue

  12. #12
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    -> Ta boîte de dialogue est dans l'exe ou dans une DLL?
    -dans un exe
    -> As-tu vérifier que tu n'avais pas de conflit d'ID : IDC_MODIF_MENSUEL est bien unique?
    -oui,il est bien unique
    -> Es-tu en configuration multi-thread?
    -oui
    Le lancement de la boîte de dialogue se fait-il dans le thread principal?
    - oui.

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'ai injecté le code que tu m'as fourni dans une coquille à moi. Et cela marche parfaitement. Donc, là, je sèche. Désolé. Pour moi, ce genre de problème est du à soit le contrôle n'est pas défini dans la boîte de dialogue (ce qui n'est pas ton cas au vue du fichier ressources), soit cela peut être un problème du multithread (boîte de dialogue créée dans un thread et DoModal dans un second) - ce qui d'après ce que tu dis n'est pas le cas non plus. Donc, là, je vois plus.
    Si ton projet n'est pas trop gros ni confidentiel, peut-être peux-tu le poster en entier.

  14. #14
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    -problème est du à soit le contrôle n'est pas défini dans la boîte de dialogue
    ==> comment peux t on s'en assurer réellement?

    -soit cela peut être un problème du multithread (boîte de dialogue créée dans un thread et DoModal dans un second)
    ==> si j'instancie pas de thread c'est que j'utilise le thread principal je suppose.


    -j'ai juste une remarque de plus sur la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CWnd* CWnd::GetDlgItem(int nID) const
    {
    	ASSERT(::IsWindow(m_hWnd));
    
    	if (m_pCtrlCont == NULL)
    		return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    	else
    		return m_pCtrlCont->GetDlgItem(nID);
    }
    en premier lieu on a "m_pCtrlCont == NULL" donc on on devrait passer par
    ::GetDlgItem(m_hWnd, nID) puis le resultat sera passer comme argument
    à la méthode CWnd::FromHandle()
    or ce n'est pas le cas,on passe directement par cette derniére avec comme
    paramétre (HWND hWnd=NULL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd* PASCAL CWnd::FromHandle(HWND hWnd)
    ainsi on passe par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);
    qui nous renvoie vers la méthode(avec h=NULL):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CObject* CHandleMap::FromHandle(HANDLE h)
    {
    	ASSERT(m_pClass != NULL);
    	ASSERT(m_nHandles == 1 || m_nHandles == 2);
    
    	if (h == NULL)
    		return NULL;
    ---
    }

    et ça retourne pointeur NULL sur lequel on essaye d'invoquer la méthode:ShowWindow avec m_hWnd NULL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL CWnd::ShowWindow(int nCmdShow)
    {
    	ASSERT(::IsWindow(m_hWnd));
    d'ou l'assertion.

    avez vous une idée sur ce comportement?

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par karim2009 Voir le message
    -problème est du à soit le contrôle n'est pas défini dans la boîte de dialogue
    ==> comment peux t on s'en assurer réellement?
    Si tu enlèves le code qui plante, est-ce que ton contrôle s'affiche? Est ce qu'avec Spy++ tu peux voir si l'ID du contrôle est bien celui que tu penses?
    Citation Envoyé par karim2009 Voir le message
    -soit cela peut être un problème du multithread (boîte de dialogue créée dans un thread et DoModal dans un second)
    ==> si j'instancie pas de thread c'est que j'utilise le thread principal je suppose.
    Oui.

    Citation Envoyé par karim2009 Voir le message
    -j'ai juste une remarque de plus sur la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CWnd* CWnd::GetDlgItem(int nID) const
    {
    	ASSERT(::IsWindow(m_hWnd));
    
    	if (m_pCtrlCont == NULL)
    		return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    	else
    		return m_pCtrlCont->GetDlgItem(nID);
    }
    en premier lieu on a "m_pCtrlCont == NULL" donc on on devrait passer par
    ::GetDlgItem(m_hWnd, nID) puis le resultat sera passer comme argument
    à la méthode CWnd::FromHandle()
    or ce n'est pas le cas,on passe directement par cette derniére avec comme
    paramétre (HWND hWnd=NULL)
    Tu y passes probablement sauf que les sources n'étant pas fourni, tu ne rentre pas dans la fonction. Si tu passes en assembleur et que tu fais tu pas à pas, tu verras que tu rentre bien dans une fonction. Mais, si comme moi, tu ne parles pas couramment l'assembleur, ce te sera de peu d'utilité

    Citation Envoyé par karim2009 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);
    Que vaut hWnd? NULL ou une valeur qui ressemble à quelque chose?
    Si c'est NULL, c'est bien que GetDlgItem(m_hWnd, nID) a échoué. Donc le problème se situe bien au niveau de l'ID du contrôle.

  16. #16
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    -Si tu enlèves le code qui plante, est-ce que ton contrôle s'affiche?

    si j'enléve les boutons la fenêtre s'affichera vide bien sûr.

    -Tu y passes probablement sauf que les sources n'étant pas fourni, tu ne rentre pas dans la fonction. Si tu passes en assembleur et que tu fais tu pas à pas, tu verras que tu rentre bien dans une fonction. Mais, si comme moi, tu ne parles pas couramment l'assembleur, ce te sera de peu d'utilité

    lorsqu'on debug nous ne rentrons pas assez dans les méthodes du Visual C++?


    -Que vaut hWnd? NULL ou une valeur qui ressemble à quelque chose?
    Si c'est NULL, c'est bien que GetDlgItem(m_hWnd, nID) a échoué. Donc le problème se situe bien au niveau de l'ID du contrôle.

    avant d'entrer dans la méthode CWnd::GetDlgItem une valeur non NULL(0x001607f8) puis une fois on passe au test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (m_pCtrlCont == NULL)
    		return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    ça devient NULL(0x00000000)

    Si c'est NULL, c'est bien que GetDlgItem(m_hWnd, nID) a échoué. Donc le problème se situe bien au niveau de l'ID du contrôle.


    j'envoi un imprimé écran qui montre bien ça.
    Fichiers attachés Fichiers attachés

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par karim2009 Voir le message
    si j'enléve les boutons la fenêtre s'affichera vide bien sûr.
    Je me suis mal exprimé. Il ne s'agit pas d'enlever les boutons de la fenêtre mais seulement le morceau de code où tu fais GetDlgItem().

    Citation Envoyé par karim2009 Voir le message
    lorsqu'on debug nous ne rentrons pas assez dans les méthodes du Visual C++?
    En général, tu a le code des MFC, mais pas celui de Win32. Et comme au final, beaucoup d'appel des MFC se terminent par un appel sur Win32, tu ne peux rentrer dans ces fonctions.

    Dans, CDlgCalendrierDechargement::CacheTousCtrl(), remplace la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetDlgItem(IDC_MODIF_MENSUEL)->ShowWindow(FALSE);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HWND hControle = ::GetDlgItem(m_hWnd, IDC_MODIF_MENSUEL);
    Quelle est la valeur de hControle après l'exécution de cette ligne ?

    [EDIT] Pour répondre, tu peux utiliser les balises [ QUOTE] et [/ QUOTE] pour reprendre ce qui est dit dans le fil précédent (sans l'espace entre [ et Q)

  18. #18
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    [EDIT]Il ne s'agit pas d'enlever les boutons de la fenêtre mais seulement le morceau de code où tu fais GetDlgItem().
    [ QUOTE]==> ça crash lors de l'appel de GetDlgItem() avec axTrue. [/ QUOTE]

    [EDIT]En général, tu a le code des MFC, mais pas celui de Win32. Et comme au final, beaucoup d'appel des MFC se terminent par un appel sur Win32, tu ne peux rentrer dans ces fonctions.

    [ QUOTE]==> OK,je te suis maintenant. [/ QUOTE]


    [EDIT]Dans, CDlgCalendrierDechargement::CacheTousCtrl(), remplace la ligne
    Code :

    GetDlgItem(IDC_MODIF_MENSUEL)->ShowWindow(FALSE);

    par
    Code :

    HWND hControle = ::GetDlgItem(m_hWnd, IDC_MODIF_MENSUEL);

    Quelle est la valeur de hControle après l'exécution de cette ligne ?

    [ QUOTE]==>valeur NULL : 0x00000000 [/ QUOTE]

  19. #19
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Essaie le fichier attaché et dis-moi si ton contrôle s'affiche (la boîte n'est pas fonctionnelle, mais devrait s'afficher).
    Fichiers attachés Fichiers attachés

  20. #20
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    ça ne fait pas crasher la fenêtre mais la fenêtre s'affhiche vide sans comobox,bouton,libelé.
    juste avec les bouton:OK et CANCEL.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [Struts] Null Pointer Exception
    Par n@n¤u dans le forum Struts 1
    Réponses: 1
    Dernier message: 01/08/2006, 14h10
  2. Null Pointer Exception
    Par snouppy dans le forum JBuilder
    Réponses: 3
    Dernier message: 13/06/2006, 22h53
  3. Pointeur intelligent boost : return NULL ->comment faire?
    Par choinul dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 21/12/2005, 17h24
  4. Null pointer assignement
    Par issou dans le forum C
    Réponses: 12
    Dernier message: 18/11/2005, 14h39
  5. [Language]Constructeur==> Null pointer?
    Par Chiwawa dans le forum Langage
    Réponses: 8
    Dernier message: 14/05/2005, 23h51

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