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 :

Créer/Récupérérer un dossier: Problème avec SHBrowseForFolder


Sujet :

Windows

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut Créer/Récupérérer un dossier: Problème avec SHBrowseForFolder
    Bonjour,

    Afin de permettre à l'utilisateur de sélectionner ou de créer un nouveau répertoire, j'ai utilisé le code suivant sous visual c++ 6 et sur Windows XP:

    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
    33
    void CTLSDLDlg::OnReglageModifHistorique()
    {
    	LPMALLOC pMalloc; 
    	/* Gets the Shell's default allocator */ 
    	if (::SHGetMalloc(&pMalloc) == NOERROR) 
    	{ 
    		BROWSEINFO bi; 
    		char pszBuffer[MAX_PATH]; 
    		LPITEMIDLIST pidl; 
    		// Get help on BROWSEINFO struct - it's got all the bit settings. 
    		bi.hwndOwner = GetSafeHwnd(); 
    		bi.pidlRoot = NULL; 
    		bi.pszDisplayName = pszBuffer; 
    		bi.lpszTitle = _T("Création ou sélection du répertoire pour la sauvegarde des fichiers d'historique"); 
    		//bi.ulFlags = BIF_EDITBOX; 
    		bi.lpfn = NULL; 
    		bi.lParam = 0; 
    		
    		// This next call issues the dialog box. 
    		if ((pidl = ::SHBrowseForFolder(&bi)) != NULL) 
    		{ 
    			if (::SHGetPathFromIDList(pidl, pszBuffer)) 
    			{ 
    				//pszBuffer contient le nom du répertoire
    			} 
    			// Free the PIDL allocated by SHBrowseForFolder. 
    			pMalloc->Free(pidl); 
    		} 
    		// Release the shell's allocator. 
    		pMalloc->Release(); 
    	}
    }
    Mon problème est le suivant:
    En mode release, je ne peux ni sélectionner un répertoire, ni en créer un et je vois seulement le bureau alors qu’en mode debug, tout cela m'est bien permis.

    Sauriez vous pourquoi et ce que je dois faire pour y remédier ?

    Merci
    Nicolas

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Les flags ne sont pas initialisés du tout.
    En mode Debug, ils se retrouvent probablement à 0xCCCCCCCC (valeurs non-initialisées en debug), alors qu'en Release, ils peuvent être n'importe quoi...

    PS: IMalloc est obsolète, tu devrais utiliser CoTaskMemFree() au lieu de SHGetMalloc() et IMalloc::Free().
    http://blogs.msdn.com/oldnewthing/ar...05/173226.aspx

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Médinoc
    Les flags ne sont pas initialisés du tout.
    En mode Debug, ils se retrouvent probablement à 0xCCCCCCCC (valeurs non-initialisées en debug), alors qu'en Release, ils peuvent être n'importe quoi...
    En effet, j'ai du faire cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef BIF_NEWDIALOGSTYLE
    #define BIF_NEWDIALOGSTYLE 0x0040
    #endif
    puis l'initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bi.ulFlags = BIF_NEWDIALOGSTYLE;
    Ce qui est bizarre, c'est qu'en debug, je n'avais pas besoin de définir BIF_NEWDIALOGSTYLE.

    Bref ca fonctionne!

    PS: IMalloc est obsolète, tu devrais utiliser CoTaskMemFree() au lieu de SHGetMalloc() et IMalloc::Free().
    http://blogs.msdn.com/oldnewthing/ar...05/173226.aspx
    Merci pour le lien.

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

Discussions similaires

  1. Problème avec explorer à l'ouverture des dossiers
    Par anouchkaya dans le forum Windows XP
    Réponses: 17
    Dernier message: 01/07/2008, 15h30
  2. Réponses: 14
    Dernier message: 01/05/2007, 19h25
  3. Réponses: 21
    Dernier message: 09/04/2006, 23h13
  4. Problème avec la fonction créer requete de la FAQ
    Par greg64 dans le forum Access
    Réponses: 8
    Dernier message: 28/03/2006, 12h28
  5. Réponses: 1
    Dernier message: 22/12/2005, 09h39

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