| auteur : Farscape | 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 :
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 );
|
Le .ini résultant est stocké dans le répertoire Windows et porte le nom de l'application.
Les fonctions de lecture admettent un argument pour spécifier une valeur par défaut quand la clef n'existe pas
dans le .ini.
|
| auteur : Farscape | Avec la fonction :
CWinApp:: WriteProfileBinary
BOOL WriteProfileBinary ( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData,
UINT nBytes );
|
Les usages sont divers, par exemple stocker les dimensions d'une fenêtre ou sa position, la valeur d'un colorref etc?
Exemple :
CRect RectInitial;
AfxGetApp ()- > WriteProfileBinary (" MainBar " ," SizeAndPos " ,
(BYTE* )(LPRECT)RectInitial,sizeof (RECT));
COLORREF cGroupBkColor;
AfxGetApp ()- > WriteProfileBinary (" Colors " ," bkg " ,(BYTE * )& cGroupBkColor,sizeof (COLORREF));
BYTE* pb = NULL ;
UINT nLen = 0 ;
if (AfxGetApp ()- > GetProfileBinary (" MainBar " ," SizeAndPos " ,& pb,& nLen))
{
ASSERT (nLen = = sizeof (RECT));
memcpy (& RectInitial, pb, sizeof (RECT));
delete pb;
}
|
|
| auteur : Farscape | Si l'entier ne doit pas être stocké sous forme ASCII on utilisera
CWinApp:: GetProfileInt
UINT GetProfileInt ( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );
|
Exemple d'écriture.
int iAge= 20 ;
AfxGetApp ()- > WriteProfileInt (" Clef " , " Age " , iAge);
CString str;
str.Format (" %d?,iAge);
AfxGetApp ()- > WriteProfileString (" Clef " , " Age " , str);
|
Exemple de lecture
int iAge = AfxGetApp ()- > GetProfileInt (" Clef " , " Age " , 0 );
int iAge = atoi (AfxGetApp ()- > GetProfileString (?Cleg?,?Age?,?0 ?));
|
|
| auteur : Farscape | Par défaut le .ini prend le nom du programme.
On accède au nom interne par la variable :
CWinApp:: m_pszProfileName
|
si on veut changer le nom il faudra procéder comme suit:
free ((void * )m_pszProfileName);
m_pszProfileName = _tcsdup (_T (" c:\\quelquepart\\ myini.ini " ));
|
|
| auteur : Farscape | La classe CWinApp ne reprend pas toutes les apis de traitement sur les fichiers ini ,comme cette fonction:
GetPrivateProfileString
DWORD GetPrivateProfileString (
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
|
Comment faire alors dans une application MFC pour fournir le nom (lpFileName)?
Tout simplement en utilisant la donnée membre de la classe d'application:
CWinApp:: m_pszProfileName
|
char buffer[4096 ];
GetPrivateProfileString (NULL , NULL , NULL ,
buffer, sizeof (buffer),AfxGetApp ()- > m_pszProfileName);
|
|
| auteur : Farscape | en utilisant la fonction:
DWORD GetPrivateProfileSectionNames (
LPTSTR lpszReturnBuffer,
DWORD nSize,
LPCTSTR lpFileName
);
|
cette fonction retourne le nom des sections dans la chaîne lpszReturnBuffer,et chaque section est séparée par un '\0' :
char * szReturnedString= new char [32000 ];
int nSizeRet= GetPrivateProfileSectionNames ( szReturnedString,
32000 ,
" c:\\windows\\myininame.ini " );
int nSection= 0 ,npos= 0 ;
while (npos< nSizeRet)
{
npos+ = (strlen (szReturnedString+ npos)+ 1 );
nSection+ + ;
}
delete szReturnedString;
|
|
| auteur : Farscape | 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 :
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);
bool GetBinary (t_Str szSection,t_Str szEntry,BYTE* * ppData,UINT* pBytes);
bool WriteProfileBinary (const char * szSection,const char * szEntry,LPBYTE pData,UINT nBytes);
bool SetBinary (t_Str szSection,t_Str szEntry,LPBYTE pData,UINT nBytes);
bool DeleteKey (const char * szKey, const char * szFromSection = " " );
bool DeleteSection (const char * szSection);
bool FindSection (const char * szSection);
bool FindKey (const char * szKey,const char * szSection);
bool IsLoad (){ return m_bLoaded;}
|
|
| auteur : Farscape |
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.
|
Consultez les autres F.A.Q.
|
|