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++/CLI Discussion :

Fichiers de configuration en C++/CLI


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Points : 25
    Points
    25
    Par défaut Fichiers de configuration en C++/CLI
    Bonjour,

    Je ne parviens pas à récupérer la section d'un fichier de configuration chargé.
    Je suis parti de ce tutoriel:
    http://nico-pyright.developpez.com/t...rationsection/

    Voici le code que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Ouverture du fichier de configuration
    System::Configuration::ExeConfigurationFileMap^ fileMap = gcnew System::Configuration::ExeConfigurationFileMap();
    fileMap->ExeConfigFilename = sConfig;
    System::Configuration::Configuration^ config =
    	System::Configuration::ConfigurationManager::OpenMappedExeConfiguration(fileMap, System::Configuration::ConfigurationUserLevel::None);
     
    // Récupération de la section
    System::Configuration::ConfigurationSection^ section
    	= config->GetSection("MonGroupe/MaSectionUne");
    System::Collections::Specialized::NameValueCollection^ nsection
    	= dynamic_cast<System::Collections::Specialized::NameValueCollection^>(section);
    L'appel de la fonction GetSection retourne bien une ConfigurationSection valide. Mais le cast en NameValueCollection comme indiqué sur le tuto ne fonctionne pas (<valeur non définie>)

    Je ne trouve pas comment accéder aux paires [key, value] d'une ConfigurationSection.
    Quelqu'un aurait-il une piste ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    3 Pistes:

    - Avant de caster comme un sauvage votre variable "section", vérifiez avec le débuggeur de VS le type réel de cette variable. (Si elle n'est pas nulle )
    - Avec le contenu du fichier de config, on pourrait peut-être vous dire ou votre code n'est pas bon, vis-à-vis du fichier.
    - Le fichier n'a pas été trouvé car non copié en post-compilation à l'endroit prévu.

  3. #3
    Nouveau membre du Club
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    - Quand je récupère la section avec le code suivant la variable section n'est pas nulle. Avec le debugger Visual, la variable membre _rawXml de la section est bien remplie avec le fichier de config.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Récupération de la section
    System::Configuration::ConfigurationSection^ section
    	= config->GetSection("MonGroupe/MaSectionUne");
    - Mon fichier est celui du tuto, à savoir

    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
    <configuration>
      <configSections>
        <sectionGroup name="MonGroupe">
          <section name="MaSectionUne" type="System.Configuration.NameValueSectionHandler" />
          <section name="MaSectionDeux" type="System.Configuration.DictionarySectionHandler" />
        </sectionGroup>
      </configSections>
      <MonGroupe>
        <MaSectionUne>
          <add key="cle1" value="valeur1" />
          <add key="cle2" value="valeur2" />
          <add key="cle3" value="valeur3" />
        </MaSectionUne>
        <MaSectionDeux>
          <add key="id1" value="valeur4" />
          <add key="id2" value="valeur5" />
          <add key="id3" value="valeur6" />
        </MaSectionDeux>
      </MonGroupe>
    </configuration>
    - Le fichier est bien copié, bien chargé car je récupère bien la section

    En résumé tout ce passe bien jusqu'au cast...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    vérifiez avec le débuggeur de VS le type réel de cette variable
    section

  5. #5
    Nouveau membre du Club
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    Voici ce que j'ai dans le debugger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -		section	0x0012f0e4 { _section=0x01d72c88 }	System::Configuration::ConfigurationSection^
    +		[System::Configuration::DefaultSection^]	0x0012f0e4 { s_properties=0x02cd7cb4 _rawXml="<MaSectionUne>
          <add key="cle1" value="valeur1" />
          <add key="cle2" value="valeur2" />
          <add key="cle3" value="valeur3" />
        </MaSectionUne>" _isModified=false }	System::Configuration::DefaultSection^
    +		System::Configuration::ConfigurationElement^	0x0012f0e4 { LockAttributesKey="lockAttributes" LockAllAttributesExceptKey="lockAllAttributesExcept" LockElementsKey="lockElements" ...}	System::Configuration::ConfigurationElement^
    +		SectionInformation	0x01b317a8 { Flag_Attached=1 Flag_Declared=2 Flag_DeclarationRequired=4 ...}	System::Configuration::SectionInformation^
    +		_section	0x01d72c88 { Flag_Attached=1 Flag_Declared=2 Flag_DeclarationRequired=4 ...}	System::Configuration::SectionInformation^
    Le type réel de la variable section serait un System::Configuration::ConfigurationElement^ ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Il semble que c'est un problème de retro-compatibilité:
    http://www.eggheadcafe.com/software/...iguration.aspx

    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Récupération de la section
    System::Configuration::ConfigurationSection^ section
    	= config->GetSection("MonGroupe/MaSectionUne");
    utilisez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameValueCollection ^section = (NameValueCollection^)ConfigurationManager::GetSection("MonGroupe/MaSectionUne");
    Remarquez l'utilisation de la méthode statique de ConfigurationManager et non la méthode d'instance de ConfigurationSettings.

  7. #7
    Nouveau membre du Club
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    La méthode statique me retourne un pointeur nul.
    Ce qui est normal vu que je charge le fichier de configuration en utilisant un objet.
    A moins qu'il existe également une méthode statique qui permette de charger un fichier de config ??

  8. #8
    Nouveau membre du Club
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    En suivant cette piste:
    http://stackoverflow.com/questions/1...194763#2194763

    Je suis arrivé au code suivant :
    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
     
    System::Configuration::ExeConfigurationFileMap^ fileMap = gcnew System::Configuration::ExeConfigurationFileMap();
    fileMap->ExeConfigFilename = sConfig;
    System::Configuration::Configuration^ config =
    	System::Configuration::ConfigurationManager::OpenMappedExeConfiguration(fileMap, System::Configuration::ConfigurationUserLevel::None);
     
    System::Configuration::ConfigurationSection^ section;
    section = config->GetSection("MonGroupe/MaSectionUne");
     
    String^ rawXml = section->SectionInformation->GetRawXml();
    System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
    doc->Load(gcnew StringReader(rawXml));
    System::Configuration::SingleTagSectionHandler^ handler = gcnew System::Configuration::SingleTagSectionHandler();
    obj = handler->Create(doc, doc, doc->DocumentElement);
    System::Collections::Hashtable^ result = dynamic_cast<System::Collections::Hashtable^>(obj);
    for each (String^ item in result->Keys)
    {
    	Console::WriteLine("{0}\t=\t{1}", item, result[item]);
    }
    Sauf que la ligne 14 (handler->Create()) me pète une erreur 'System.InvalidCastException'.

    Je ne sais plus quoi faire...

  9. #9
    Nouveau membre du Club
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    J'ai enfin résolu mon problème

    Voici le fichier app.config utilisé.
    Noter l'absence de la balise xml.

    <?xml version="1.0" encoding="utf-8" ?>
    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
    <configuration>
      <configSections>
        <sectionGroup name="MonGroupe">
          <section name="MaSectionUne" type="System.Configuration.NameValueSectionHandler" />
          <section name="MaSectionDeux" type="System.Configuration.DictionarySectionHandler" />
        </sectionGroup>
      </configSections>
      <MonGroupe>
        <MaSectionUne>
          <add key="cle1" value="valeur1" />
          <add key="cle2" value="valeur2" />
          <add key="cle3" value="valeur3" />
        </MaSectionUne>
        <MaSectionDeux>
          <add key="id1" value="valeur4" />
          <add key="id2" value="valeur5" />
          <add key="id3" value="valeur6" />
        </MaSectionDeux>
      </MonGroupe>
    </configuration>
    Pour lire ce fichier, le code est le suivant

    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
    // Configuration File
    ExeConfigurationFileMap^ fileMap = gcnew ExeConfigurationFileMap();
    fileMap->ExeConfigFilename = sConfig;
    System::Configuration::Configuration^ config =
    	System::Configuration::ConfigurationManager::OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel::None);
     
    // Group
    ConfigurationSection^ group = config->GetSection("MonGroupe/MaSectionUne");
     
    // XML
    String^ rawXml = group->SectionInformation->GetRawXml();
    System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
    doc->Load(gcnew StringReader(rawXml));
     
    // Section
    NameValueSectionHandler^ handler = gcnew NameValueSectionHandler();
    Object^ obj = handler->Create(nullptr, nullptr, doc->DocumentElement);
    NameValueCollection^ section = dynamic_cast<NameValueCollection^>(obj);
     
    for each(String^ aKey in section)
    {
    	Console::WriteLine("{0} ; {1}", aKey, section[aKey]);
    }
    Noter la correspondance de l'utilisation de la classe NameValueSectionHandler() avec le type de la section type="System.Configuration.NameValueSectionHandler" définit dans le fichier app.config.

    D'autre part en C++/CLI, un pointeur nul est définit par nullptr (et pas null ou 0)


    Problème résolu

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Un grand merci pour ce partage de votre solution.

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

Discussions similaires

  1. [Log4j] fichier de configuration ou XML ?
    Par nabilblk dans le forum Logging
    Réponses: 2
    Dernier message: 02/09/2005, 16h42
  2. [langage] Lire un fichier de configuration
    Par bobinoo dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2004, 15h53
  3. Les fichiers de configuration de comptes avec Samba
    Par tomnie dans le forum Réseau
    Réponses: 4
    Dernier message: 18/03/2004, 08h30

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