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

MFC Discussion :

[WINDOWS CE]WriteProfileString ne fonctionne pas


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut [WINDOWS CE]WriteProfileString ne fonctionne pas
    Bonjour,

    ==> Windows CE & Visual C++ 4.0 sur un pocket PC.

    Je n'arrive pas à utiliser la fonction WriteProfileString pour écrire dans un fichier INI. Voici le code :
    ___________________________________
    CString strSection = _T("My Section");
    CString strStringItem = _T("My String Item");
    CString strIntItem = _T("My Int Item");
    CWinApp* pApp = AfxGetApp();

    pApp->WriteProfileString(strSection, strStringItem, _T("test"));
    ____________________________________________________

    La fonction renvoie toujours zéro, le fichier INI n'est pas créé.
    Le membre m_pszProfileName est bien renseigné dans l'objet pApp.

    Après des heures de recherche je ne trouve pas, j'ai vraiment besoin d'utiliser un FICHIER .ini, et pas le registre.

    De l'aide serait bienvenue, merci par avance,

  2. #2
    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,
    par defaut si c'est pareil qu'une application MFC classique les données sont enregitrées dans la base de registre .
    supprime la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    dans InitInstance.


  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci pour la réponse rapide !

    Malheureusement je n'ai pas d'instruction SetRegistryKey dans le programme.

    C'est une application MFC "Dialog based".

    De plus, le membre m_pszRegistryKey possède bien la valeur "NULL" (0x00000...) dans l'objet CWinApp de mon appli, ce qui laisse penser que SetRegistryKey n'a pas été appelé.

    Une autre idée ?
    ;-)

  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
    re,
    note au cas ou : le fichier .ini doit etre dans le repertoire windows.
    que renvoie Writeprofilestring ? TRUE/FALSE ?
    que contient la variable CWinApp::m_pszProfileName ?
    as tu les droits d'ecrire dans le repertoire windows ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    WriteProfileString renvoie FALSE (zéro)

    l'exécutable s'appelle "test7.exe".
    La variable CWinApp::m_pszProfileName contient "test7.INI"
    La variable CWinApp::m_pszRegistryKey est à NULL

    J'ai le droit d'écrire dans le répertoire Windows.

    Pour tester, j'ai créé sur le desktop un fichier test7.ini qui contient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [WLSECTION]
    WLITEM="ok"
    et j'ai transféré ce fichier dans le répertoire Windows du pocket PC.
    Même résultat, WriteProfileString renvoie FALSE.

    Puis j'ai essayé ce code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CString	l_csSection = "WLSECTION";
    CString	l_csEntry	= "WLITEM";
    CString	l_csWork;
    CWinApp* pApp = AfxGetApp();
     
    l_csWork = pApp->GetProfileString( l_csSection, l_csEntry, _T("Default") );
    En sortie de GetProfileString, le CString l_csWork contient "Default", ce qui montre que le fichier test7.ini, bien qu'existant dans le répertoire Windows, n'a pas été lu.

    Voilà, je sèche sur ce coup ;-/

  6. #6
    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
    fait un essai avec l'api win32 direct:
    BOOL WritePrivateProfileString(
    LPCTSTR lpAppName, // section name
    LPCTSTR lpKeyName, // key name
    LPCTSTR lpString, // string to add
    LPCTSTR lpFileName // initialization file
    );
    un coup tu mets juste le nom du fichier ini .
    si ça fonctionne pas tu essaye de le mettre a un autre emplacement en precisant le chemin :ex "c:\\test7.ini"


  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Mais pas de chance, WritePrivateProfileString et GetPrivateProfileString n'existent pas sous Windows CE, pas plus que le win32 d'ailleurs

    la doc Microsoft n'expose que WriteProfileString :
    Microsoft Foundation Class Library for Windows CE

    CWinApp::WriteProfileStringThis method writes the specified string into the specified section of the .ini file in the application.

    BOOL WriteProfileString(
    LPCTSTR lpszSection,
    LPCTSTR lpszEntry,
    LPCTSTR lpszValue );
    Parameters

    lpszSection
    Points to a null-terminated string that specifies the section containing the entry. If the section does not exist, it is created. The name of the section is case independent; the string may be any combination of uppercase and lowercase letters.
    lpszEntry
    Points to a null-terminated string that contains the entry into which the value is to be written. If the entry does not exist in the specified section, it is created.
    lpszValue
    Points to the string to be written. If this parameter is NULL, the entry specified by the lpszEntry parameter is deleted.
    Return Value

    Nonzero if it is successful; otherwise, it is zero.

    Example

    CString strSection = "My Section";
    CString strStringItem = "My String Item";
    CString strIntItem = "My Int Item";

    CWinApp* pApp = AfxGetApp();

    pApp->WriteProfileString(strSection, strStringItem, "test");

    CString strValue;
    strValue = pApp->GetProfileString(strSection, strStringItem);
    ASSERT(strValue == "test");

    pApp->WriteProfileInt(strSection, strIntItem, 1234);
    int nValue;
    nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
    ASSERT(nValue == 1234);
    For another example, see the example for CWinApp::GetProfileInt.

    Requirements

    Windows CE versions: 1.0 and later
    Header file: Declared in Afxwin.h

    See Also
    et, sauf (grossière) erreur de ma part, j'ai codé en conformité.

    PS : désolé pour la longueur de ce post

  8. #8
    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
    re,
    apres verifications effectivement pas de privateprofilestring sous CE ,donc pas de support des .ini car WriteProfileString des MFC appel cette fonction ...
    je te propose ça issu d'une contribution sous codeguru que j'ai corrigée/modifiée ,il y avait des fuites memoires:
    http://farscape.developpez.com/Samples/CDataFile.zip
    utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // set
    CDataFile IniFile("c:\\windows\\myIni.ini");
    IniFile.SetValue(pStrKeyName,pStrVal,"",pStrSection);
    // get 
    CString	str=IniFile.GetString(pStrKeyName,pStrSection).c_str();

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci pour le code.

    J'étais venu ce matin avec l'intention d'écrire un parser de fichier INI 8)
    Mais puisque le code transmis en est un, je gagne du temps.

    Je l'essaye de ce pas et je reviens clôturer le topic avec mes apréciations.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Voilà les dernières infos :

    Il n'y a pas de fstream ni de iostream dans embedded Visual C++ 4.0, donc le code CDataFile ne fonctionne pas pour le moment.

    Soit je reconsidère mon projet pour le faire fonctionner sous .NET 2003, soit je tente d'encapsuler d'une manière ou d'une autre fstream (ça a l'air galère), soit j'écris un parser... à voir.

  11. #11
    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 tu regardes j'avais commencé a remplacer les fstream par des CStdioFile a priori il ne reste plus qu'a l'enlever :
    dans
    bool CDataFile::Load(t_Str szFileName)
    ce qui ne devrait pas etre galere.
    ensuite virer les references :
    #include <fstream>

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Je regarde ça
    Mais avec Windows CE c'est plein de surprises. Par exemple, pas de CStdioFile

    Pour le moment je rattrape le temps perdu en codant les params en dur dans mon appli, puis j'approfondirai ce code d'ici quelques jours.
    Encore merci , je reviendrai donner des news.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    The end :

    En fait il suffisait de se donner la peine de regarder le code d'un peu plus près

    J'ai remplacé les stream par des bons vieux FILE*, les open par fopen etc. etc., soit en tout une quinzaine de lignes à modifier, et... ça marche !


    Donc, en résumé, si l'on veut utiliser des fichiers INI sous Windows CE :
    1°) récuper le code fourni ci-dessus par farscape (1 fichier .cpp et un .h)
    2°) enlever toute référence à stream et/ou iostream
    3°) Adapter les lignes, dans la fonction "load" du .cpp, pour mettre des FILE* à la place des stream, des fopen, à la place des open (caster quelques arguments), des fgets au lieu des readstring, des fprintf à la place des WriteLN. Je veux bien télécharger les 2 fichiers modifiés si toutefois c'est possible.

    Merci encore

  14. #14
    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,
    tu peux me les envoyer par mail ?
    je ferais un post pour la faq sur le sujet avec...

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par farscape
    salut,
    tu peux me les envoyer par mail ?
    je ferais un post pour la faq sur le sujet avec...
    Oui, mais il n'y a pas d'e-mail dans ton profil, et en MP je ne vois pas le moyen de joindre des pièces ?

    remarque je peux toujours envoyer le code en post

  16. #16
    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
    Citation Envoyé par protonos
    Citation Envoyé par farscape
    salut,
    tu peux me les envoyer par mail ?
    je ferais un post pour la faq sur le sujet avec...
    Oui, mais il n'y a pas d'e-mail dans ton profil, et en MP je ne vois pas le moyen de joindre des pièces ?

    remarque je peux toujours envoyer le code en post
    comment ça ?,
    tu clic sur le bouton mail d'un de mes messages et ça roule ...


  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Hem...

    Je ne suis pas bourré, je le jure.
    Mais je ne vois aucun bouton mail.

    Sous tes messages, je vois 4 boutons :
    PROFIL-MP-AIM-ICQ
    Dans le haut du message je vois "Citer".
    Aucun autre hyperlink dans la page :

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Pour info,

    J'ai du corriger une anomalie concernant les chaines de caractère.
    Dans le fichier CDataFile.cpp, au début vers la ligne 90, en-dessous de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *  EqualIndicators   = "=:";
    j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *  StringIndicators   = "\"'";
    Dans la fonction Trim j'ai ajouté une ligne puis corrigé la dernière ligne comme ceci :
    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
    void Trim(t_Str& szStr)
    {
    	t_Str szTrimChars = WhiteSpace;
     
    	szTrimChars += EqualIndicators;
    	szTrimChars += StringIndicators;
    	int nPos, rPos;
     
    	// trim left
    	nPos = szStr.find_first_not_of(szTrimChars);
     
    	if ( nPos > 0 )
    		szStr.erase(0, nPos);
     
    	// trim right and return
    	nPos = szStr.find_last_not_of(szTrimChars);
    	rPos = szStr.find_last_of(szTrimChars);
     
    	if ( rPos > nPos && rPos > -1)
    		//szStr.erase(rPos, szStr.size()-rPos);
    		szStr.erase(nPos+1, rPos-nPos);
    }
    à mon avis la ligne "szStr.erase(rPos, szStr.size()-rPos)" était une erreur, elle ne trimait pas bien à droite.
    Voilà, si ça peut aider.

    Maintenant je peux écrire les strings soit avec rien :
    MYSTRING = TOTO
    soit avec des simples quotes :
    MYSTRING = 'TOTO'
    soit des doubles
    MYSTRING = "TOTO"
    et avec un nombre quelconque d'espaces.
    MYSTRING = TOTO

    Bien entendu, s'il doit y avoir un espaces, il faut mettre des quotes :
    MYSTRING = "CECI EST TOTO"

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

Discussions similaires

  1. $(window).trigger('resize'); ne fonctionne pas
    Par green29 dans le forum jQuery
    Réponses: 3
    Dernier message: 04/08/2013, 00h17
  2. [Windows 8] setTimeout ne fonctionne pas
    Par zenico64 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2012, 15h01
  3. [Internet Explorer] window.location.replace ne fonctionne pas
    Par Gat- dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/02/2007, 13h15
  4. window.history.forward() ne fonctionne pas sous FF
    Par khokho dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/01/2007, 18h01
  5. window.resizeTo ne fonctionne pas avec firefox?
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 15h07

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