FAQ VC++ et MFCConsultez toutes les FAQ

Nombre d'auteurs : 20, nombre de questions : 546, 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


SommaireClasse d'application (CWinApp)Les Fichiers .ini (8)
précédent sommaire suivant
 

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 );
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.

Mis à jour le 5 avril 2013 farscape

Avec la fonction :

Code c++ : Sélectionner tout
1
2
3
4
  
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 :

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; 
}

Mis à jour le 5 avril 2013 farscape

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 );
Exemple d'écriture.

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);
Exemple de lecture

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));

Mis à jour le 5 avril 2013 farscape

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
si on veut changer le nom il faudra procéder comme suit:

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"));

Mis à jour le 5 avril 2013 farscape

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 
);
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:

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);

Mis à jour le 5 avril 2013 farscape

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 
);
cette fonction retourne le nom des sections dans la chaîne lpszReturnBuffer,et chaque section est séparée par un'\0':

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;

Mis à jour le 4 avril 2005 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 :

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;}
La classe :

Mis à jour le 27 novembre 2005 farscape

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.

Mis à jour le 22 janvier 2007 farscape

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2017 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.

 
Contacter le responsable de la rubrique C++