FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013 Ajouter une question
Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture. Farscape
- Comment faire pour écrire et lire dans un fichier .ini ?
- Comment stocker une zone binaire dans un .ini ?
- Comment lire/écrire un entier dans un .ini ?
- Comment faire pour changer le nom du .ini dans une application MFC ?
- Comment utiliser les autres fonctions dédiées aux fichiers .ini dans une application MFC ?
- Comment compter le nombre de sections d'un fichier ini ?
- Comment travailler avec un fichier INI avec eMbedded visual C++?
- Comment supprimer une clef ou une section dans un fichier .ini ?
Les MFC fournissent les fonctions de base pour gérer les .ini
Elles permettent l'écriture/lecture d'entiers, de chaînes de caractères, de zones binaires.
Elles sont contenues dans la classe CWinApp :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | CWinApp::GetProfileInt UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault ); CWinApp::WriteProfileInt BOOL WriteProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue ); CWinApp::GetProfileString CString GetProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault = NULL ); CWinApp::WriteProfileString BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue ); CWinApp::WriteProfileBinary BOOL WriteProfileBinary( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes ); CWinApp::GetProfileBinary BOOL GetProfileBinary(LPCTSTR lpszSection,LPCTSTR lpszEntry,LPBYTE* ppData, UINT* pBytes ); |
Les fonctions de lecture admettent un argument pour spécifier une valeur par défaut quand la clef n'existe pas dans le .ini.
Avec la fonction :
Code c++ : | Sélectionner tout |
1 2 3 4 | CWinApp::WriteProfileBinary BOOL WriteProfileBinary( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes ); |
Exemple :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | CRect RectInitial; AfxGetApp()->WriteProfileBinary("MainBar","SizeAndPos", (BYTE*)(LPRECT)RectInitial,sizeof(RECT)); COLORREF cGroupBkColor; AfxGetApp()->WriteProfileBinary("Colors","bkg",(BYTE *)&cGroupBkColor,sizeof(COLORREF)); // la lecture BYTE* pb = NULL; UINT nLen = 0; if(AfxGetApp()->GetProfileBinary("MainBar","SizeAndPos",&pb,&nLen)) { ASSERT(nLen == sizeof(RECT)); memcpy(&RectInitial, pb, sizeof(RECT)); delete pb; } |
Si l'entier ne doit pas être stocké sous forme ASCII on utilisera
Code c++ : | Sélectionner tout |
1 2 3 4 | CWinApp::GetProfileInt UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault ); |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | int iAge=20 ; AfxGetApp()->WriteProfileInt("Clef ", "Age", iAge); // sous Forme ASCII CString str; str.Format("%d”,iAge); AfxGetApp()->WriteProfileString("Clef ", "Age", str); |
Code c++ : | Sélectionner tout |
1 2 3 4 | int iAge = AfxGetApp()->GetProfileInt("Clef ", "Age", 0); // sous Forme ASCII int iAge =atoi(AfxGetApp()->GetProfileString(“Cleg”,”Age”,”0”)); |
Par défaut le .ini prend le nom du programme.
On accède au nom interne par la variable :
Code c++ : | Sélectionner tout |
1 2 | CWinApp::m_pszProfileName |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 | // // En premier libérer la mémoire allouée à la variable, cette // Allocation est faite avant InitInstance free((void*)m_pszProfileName); //changer le nom du .ini //le destructeur de CWinApp se chargera de libérer la mémoire m_pszProfileName =_tcsdup(_T("c:\\quelquepart\\ myini.ini")); |
La classe CWinApp ne reprend pas toutes les apis de traitement sur les fichiers ini ,comme cette fonction:
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | GetPrivateProfileString DWORD GetPrivateProfileString( LPCTSTR lpAppName, // section name LPCTSTR lpKeyName, // key name LPCTSTR lpDefault, // default string LPTSTR lpReturnedString, // destination buffer DWORD nSize, // size of destination buffer LPCTSTR lpFileName // initialization file name ); |
Tout simplement en utilisant la donnée membre de la classe d'application:
Code c++ : | Sélectionner tout |
1 2 | CWinApp::m_pszProfileName |
Code c++ : | Sélectionner tout |
1 2 3 4 | char buffer[4096]; GetPrivateProfileString(NULL, NULL, NULL, buffer, sizeof(buffer),AfxGetApp()->m_pszProfileName); |
en utilisant la fonction:
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | DWORD GetPrivateProfileSectionNames( LPTSTR lpszReturnBuffer, // return buffer DWORD nSize, // size of return buffer LPCTSTR lpFileName // initialization file name ); |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | char *szReturnedString= new char[32000]; int nSizeRet= GetPrivateProfileSectionNames( szReturnedString, 32000, // size of return buffer "c:\\windows\\myininame.ini"); int nSection=0,npos=0; while(npos<nSizeRet) { npos+=(strlen(szReturnedString+npos)+1); nSection++; } delete szReturnedString; |
eMbedded visual C++ ne supporte pas les fonctions d'accès aux fichiers INI, il faudra utiliser une classe simulant le fonctionnement des fichier INI.
La classe qui est proposée provient du site codeguru.
Je l'ai modifiée pour :
- Corriger les bugs de libération mémoire .
- Modifier les fonctions de lectures et écritures des données pour la compatibilité avec EVC .
- Rajouter les fonctions de bases de manipulation des fichiers INI tel que le propose les MFC .avec la classe CWinApp.
Liste des fonctions rajoutées :
Code c++ : | Sélectionner tout |
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 34 | CString GetProfileString(const char *szSection,const char *szKey,const char *szDefault=""); bool WriteProfileString(const char *szSection,const char *szKey,const char *szValue); int GetProfileInt(const char *szSection,const char *szKey,int nDefault=0); bool WriteProfileInt(const char *szSection,const char *szKey,int nValue); bool GetProfileBinary(const char * szSection,const char * szEntry,BYTE** ppData,UINT* pBytes); // GetBinary: Load a Binary value. bool GetBinary(t_Str szSection,t_Str szEntry,BYTE** ppData,UINT* pBytes); // ecriture de données binaires comme avec les MFC bool WriteProfileBinary(const char * szSection,const char * szEntry,LPBYTE pData,UINT nBytes); // SetBinary: Set a binary value bool SetBinary(t_Str szSection,t_Str szEntry,LPBYTE pData,UINT nBytes); // detruire la clef szKey pour la section szFromSection bool DeleteKey(const char * szKey, const char *szFromSection = ""); // detruire la section szSection bool DeleteSection(const char *szSection); // renvoie true si la section szSection existe bool FindSection(const char *szSection); // renvoie true si la clef szKey pour la section szSection existe bool FindKey(const char *szKey,const char *szSection); // indique si le fichier est lu bool IsLoad(){return m_bLoaded;} |
Code c++ : | Sélectionner tout |
1 2 3 | CWinApp::WriteProfileString BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue ); |
si lpszValue = NULL la clef représentée par lpszEntry est détruite.
si lpszEntry = NULL et lpszValue = NULL la section lpszSection est détruite
voir MSDN WritePrivateProfileString pour référence.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.