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

C++ Discussion :

Utilisation de la fonction GetPrivateProfileSectionNames


Sujet :

C++

  1. #1
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Par défaut Utilisation de la fonction GetPrivateProfileSectionNames
    Bonjour à tous,

    j'essaye de récupérer la liste des sections d'un fichier à l'aide la la FAQ :
    http://cpp.developpez.com/faq/vc/?pa...leSectionNames

    contrairement à l'exemple je suis obligé de caster le premier paramètre en LPTSTR,
    je sais pas si c'est ça qui pose problème mais en tout cas ça ne fonctionne pas .. ça plante avant la fin de la boucle.

    voici mon code actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            char *szReturnedString= new char[32000];
            int nSizeRet= GetPrivateProfileSectionNames( LPTSTR( szReturnedString), 32000, p_sFilePath);
     
            int nSection=0,npos=0;
            while(npos<nSizeRet)
            {
                TRACE("%d-", strlen(szReturnedString+npos)+1);
                npos+=(strlen(szReturnedString+npos)+1);
                nSection++;
            }
            delete szReturnedString;
    output:
    2-2-2-2-2-1-1-2-2-Error: failed to load message box prompt string 0x0000.
    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
    Par défaut
    Salut,
    Remplace char * par TCHAR et enlève le cast.

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete[] szReturnedString

  4. #4
    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
    Par défaut
    Et wcslen ou mieux _tcslen dans TCHAR.h
    + verif echec allocation

  5. #5
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Par défaut
    Merci pour vos réponses ça marche

    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
            TCHAR szReturnedString[32000];
            int nSizeRet= GetPrivateProfileSectionNames( szReturnedString, 32000, p_sFilePath);
     
            int nSection=0,npos=0;
            while(npos<nSizeRet)
            {
                int iSectionLength = _tcslen(szReturnedString+npos);
     
                CString sSection = _T("");
                for(int i=npos; i<npos+iSectionLength; i++)
                {
                    sSection.AppendChar(szReturnedString[i]);
                }
     
                this->m_vMaterial.push_back( new CMaterial( sSection ) );
     
                npos += iSectionLength+1;
            }
    la partie récupération des noms de section n'est peut-être pas idéale mais ça fonctionne ..


  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    allouer 32000 TCHAR sur la pile, c'est beaucoup (avec sizeof(wchar_t) == 4, ça nous ferait 128ko sur la pile, gros risque de stack overflow) --> il faudrait mieux recourir à un tableau alloué sur le tas.

  7. #7
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Par défaut
    oui c'est beaucoup je vais le réduire,
    mais vu qu'on ne connais pas la taille avant de créer le buffer je vois pas comment faire ce que tu dis.

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Si tu le réduis, ça a des chances de ne plus marcher.

    De toute façon, c'est une vieille API moisie (héritée de Win16) qu'il ne faut plus utiliser.

    Bref, tu n'a pas d'autres chois que de passer un buffer très grand, en espérant qu'il soit assez grand (t'as pas vraiment de moyen de vérifier qu'il est assez grand).

    Mon propos, c'était de dire qu'allouer ce tableau sur la pile est une mauvaise idée. Faire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TCHAR* szReturnedString = new TCHAR[32000];
    ...
    delete[] szReturnedString;
    Ce qui l'alloue sur le tas, et le libère.

    Idéalement, il faudrait mieux un auto_tab_ptr pour s'assurer de libérer la mémoire, mais ce n'est pas dans std, donc on va dire que ça suffit pour l'instant .

  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
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    t'as pas vraiment de moyen de vérifier qu'il est assez grand
    Ce sera borné par la taille du fichier .ini. Mais ça peut encore faire très grand... Après, si tu sais à peu près comment est constitué ton fichier tu peux t'en servir... mais ce sera toujours dangereux

  10. #10
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Mon propos, c'était de dire qu'allouer ce tableau sur la pile est une mauvaise idée. Faire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TCHAR* szReturnedString = new TCHAR[32000];
    ...
    delete[] szReturnedString;
    ok je vais faire ça.

    Citation Envoyé par white_tentacle Voir le message
    De toute façon, c'est une vieille API moisie (héritée de Win16) qu'il ne faut plus utiliser.
    non mais on ne m'a pas laissé le choix, j'aurai jamais choisi ce format de fichier à la noix sinon.
    Puis elle est utilisée dans le reste du projet que je reprend ..

    Merci bien

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour le auto_ptr, je me demande si on ne pourrait pas faire ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef TCHAR TrenteDeuxMilleTChars[32000];
     
    ...
     
    TrenteDeuxMilleTChars *pTab = new TrenteDeuxMilleTChars;
    TCHAR * szReturnedString = *(*pTab)[0];
    std::auto_ptr<TrenteDeuxMilleTChars> deleteTchars(pTab);
    Ou, beaucoup plus simple, utiliser un std::vector<TCHAR>.

    PS: Sous Windows (comme sous Java, d'ailleurs), les wchar_t font seulement deux octets. La première version Unicode de Windows supportait seulement UCS-2, alors ensuite, compatibilité oblige, ils ont été obligés de passer en UTF-16 au lieu de UCS-4...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [LG]Utilisation de la fonction time
    Par kmitz dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2005, 13h05
  2. Utilisation de la fonction de déploiement
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/03/2005, 14h35
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  4. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50

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