wince 基础技能 使用ini配置文件来保存信息

摘要:
今天,我想和大家分享一个最近使用的基本技能:ini文件的使用。最近的项目组没有外部eeprom。在应用程序运行时打开/关闭数据保存是一个问题,因此最常见的方法是使用ini文件。lpFileName)36return0;3738//打开文件并将文件数据复制到缓冲区g_PData,返回INI文件大小39if40{41RETAILMG;42return0;43}4445cchCopied=0;46while(0!=)47{48//RETAILMG;49//是注释行50if51continue;5253//是段名54if55{56//是段名57if58{59//查找键名60while(1!

今天和大家分享最近用到的一个基础技能:ini文件的使用

最近的项目arm没有外接eeprom,运行过程中应用程序开开关关数据的保存是个问题

所以用最常见的方式ini文件。

最开始我把ini文件存在nand flash中,但是后来发现使用的nand的擦写次数仅有10000次

于是就把ini放置在内存文件夹中

下面具体展示下代码

首先是 封装好的代码不是我写的,是网上收集的,这个算是写的不错的:

wince 基础技能 使用ini配置文件来保存信息第1张wince 基础技能 使用ini配置文件来保存信息第2张RdWrtIni.h
 1 #ifndef __RDWRTINI_H__
 2 #define __RDWRTINI_H__
 3 
 4 #define DIM(a)  sizeof(a)/sizeof(a[0])
 5 
 6 //////////////////////////////////////////////////////////////////////////
 7 // 函数声明
 8 int  ReadIniFile(LPCWSTR lpFileName);
 9 DWORD GetLine(LPWSTR pLine, DWORD dwOffset, DWORD dwSize);
10 BOOL IsComment(LPCWSTR pLine);
11 BOOL IsSection(LPCWSTR pLine);
12 BOOL IsSectionName(LPCWSTR pLine, LPCWSTR pSection);
13 BOOL IsKey(LPCWSTR pLine , LPCWSTR pKeyName, LPWSTR* pValue, DWORD* dwValLen );
14 void WriteValue(HANDLE m_hOutput , LPCWSTR pAppName, LPCWSTR pKeyName, LPCWSTR pString);
15 DWORD GetString(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPWSTR lpReturnedString,DWORD nSize,LPCWSTR lpFileName );
16 DWORD GetPrivateProfileString(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPCWSTR lpDefault, LPWSTR  lpReturnedString,DWORD   Size,LPCWSTR lpFileName );
17 UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName, INT nDefault,LPCTSTR lpFileName );
18 BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);
19 BOOL WINAPI WritePrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT Value,LPCTSTR lpFileName);
20 
21 #endif//__RDWRTINI_H__
wince 基础技能 使用ini配置文件来保存信息第3张wince 基础技能 使用ini配置文件来保存信息第4张RdWrtIni.cpp
  1 /********************************************************************
  2 created: 2007/12/03
  3 filename:  RdWrtIni.cpp
  4 author:  Kaoya
  5 purpose: Read and Write Ini file
  6 *********************************************************************/
  7 #include "StdAfx.h"
  8 #include "RdWrtIni.h"
  9 #include <stdio.h> 
 10 
 11 //////////////////////////////////////////////////////////////////////////
 12 // 全局变量
 13 LPWSTR g_pData = NULL;    // 存储整个INI文件数据的缓冲区
 14 
 15 /************************************************************************
 16 ** 函数:GetString
 17 **功能:读INI文件
 18 **参数:
 19 lpAppName[in]         - 字段名
 20 lpKeyName[in]         - 键名
 21 lpReturnedString[out] - 键值
 22 nSize[in]             - 键值缓冲区大小(in characters )
 23 lpFileName[in]        - 完整的INI文件名
 24 **返 回:Returns the number of bytes read.
 25 **备注:
 26 ************************************************************************/
 27 DWORD GetString( LPCWSTR lpAppName,LPCWSTR lpKeyName,LPWSTR lpReturnedString, DWORD nSize,LPCWSTR lpFileName)
 28 {
 29     //WCHAR szFileName[MAX_PATH];
 30     DWORD dwSize , cchCopied;
 31     DWORD dwOffset = 0;
 32     TCHAR pLine[MAX_PATH] = {0} ;
 33     DWORD dwValLen = 0;
 34 
 35     if (!lpAppName || !lpFileName)
 36     return 0;
 37 
 38     //打开文件,将文件数据拷贝到缓冲区 g_pData中,返回INI文件大小
 39     if (0 == (dwSize = ReadIniFile(lpFileName)))
 40     {
 41         RETAILMSG(1, (_T("GetString, Could not ReadIniFile INI file: %s\n"), lpFileName));
 42         return 0;
 43     }
 44 
 45     cchCopied = 0;
 46     while ( 0 != (dwOffset = GetLine( pLine , dwOffset , dwSize )))
 47     {
 48         //RETAILMSG(1,(_T("%s\n"),szLine));
 49         // 是不是注释行
 50         if (IsComment(pLine))
 51         continue;
 52 
 53         // 是不是段名
 54         if (IsSection(pLine))
 55             {
 56             // 是不是我们要找的段名
 57             if (IsSectionName(pLine,lpAppName))
 58                 {
 59                 // 寻找我们要的键名
 60                 while ( 0 != (dwOffset = GetLine(pLine , dwOffset , dwSize)))
 61                     {
 62                     LPWSTR pValue=NULL;
 63 
 64                     if (IsSection(pLine))
 65                     break;
 66 
 67                     if (IsKey(pLine , lpKeyName, &pValue, &dwValLen))
 68                         {
 69                         cchCopied = min(dwValLen, nSize-1);
 70                         wcsncpy(lpReturnedString, pValue, cchCopied);
 71                         lpReturnedString[cchCopied] = 0;
 72                         // We're done.
 73                         break;      
 74                         }
 75                     }
 76                 break;
 77                 }
 78             }
 79     }
 80 
 81      return cchCopied;
 82 }
 83 
 84 /************************************************************************
 85 ** 函数:ReadIniFile
 86 **功能:打开文件,并将文件数据拷贝到一缓冲区g_pData中 
 87 **参数:
 88 lpFileName[in] - INI文件名,如果没有路径,默认路径为\\windows\\
 89 **返回:
 90 非0 - 该INI文件的大小(in bytes)
 91 0   - 失败
 92 **备注:
 93 1). 判断一个文本文件是不是UNICODE文件:读取文件前两个字节,如果是0XFF和0XFE
 94 则 为UNICODE文件,否则为ASCII文件(注意根据CPU是大端还是小端格式),这里默
 95 认为小端格式.如果是UNICODE文件,则丢去 前两个字节.
 96 2). 先将INI整个文件数据读到BYTE型缓冲区中,再转为WCHAR型,为什么?还没弄明白
 97 ************************************************************************/
 98 int ReadIniFile(LPCWSTR lpFileName)
 99 {
100     int nReturn = 0;
101     WCHAR szFileName[MAX_PATH] ={0} ;
102     BY_HANDLE_FILE_INFORMATION fi = {0}; 
103     HANDLE hfile;
104     DWORD dwSize , dwIO;
105     BOOL bUnicode = FALSE, bRet = FALSE; // bUnicode - 标志INI文件是不是Unicode文件
106     BYTE* pData = NULL;
107 
108     if (!lpFileName)
109         {
110         nReturn = 0;
111         goto exit;
112         }
113 
114     if (wcschr(lpFileName, '\\'))
115     wcscpy(szFileName, lpFileName);
116     else
117     wsprintf(szFileName, _T("\\My Documents\\%s"), lpFileName);
118 
119     // ReadIniFile the file.
120     hfile = CreateFile(szFileName, GENERIC_READ,FILE_SHARE_READ,(LPSECURITY_ATTRIBUTES)0, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
121 
122     if (hfile == INVALID_HANDLE_VALUE)
123     {
124     RETAILMSG(1, (_T("ReadIniFile, CreateFile failed on INI file: %s, err %d\n"), szFileName, GetLastError()));
125     nReturn = 0;
126     goto exit;
127     }
128 
129     // Get its size.
130     if (!GetFileInformationByHandle(hfile, &fi))
131     {
132     CloseHandle(hfile);
133     RETAILMSG(1, (_T("ReadIniFile, GetFileInformationByHandle failed on INI file: %s\n"), szFileName));
134     nReturn = 0;
135     goto exit;
136     }
137 
138     dwSize = (fi.nFileSizeLow + 1) & ~0x1; //keep it word aligned
139 
140     // Now check if the file is unicode.
141     dwIO = 0;
142     if (sizeof(WORD) <= dwSize)
143         {
144         WORD wByteOrderMark = 0;
145 
146         // See comment at the bottom of the file.
147         if ((ReadFile(hfile, &wByteOrderMark, sizeof(WORD), &dwIO, NULL)) && (dwIO == sizeof(WORD)) && (0xfeff == wByteOrderMark))
148         {
149         dwSize -= sizeof(WORD);
150         bUnicode = TRUE;
151         }
152         else
153         SetFilePointer(hfile, 0, NULL, FILE_BEGIN);
154         }
155 
156     // Next, load the data.
157     //RETAILMSG(1, (_T("ReadIniFile, the size of ini file [%s] is [%d]\n"), szFileName, dwSize)); 
158     if (0 < dwSize)
159         {
160         pData = (BYTE *)malloc( dwSize + sizeof(WCHAR) );
161         if (!pData)
162             {
163             RETAILMSG(1, (_T("ReadIniFile, no enough memory\n")));
164             nReturn = 0;
165             goto exit;
166             }
167         memset(pData,0,dwSize + sizeof(WCHAR));
168         bRet = ReadFile(hfile, pData, dwSize, &dwIO, NULL);
169         CloseHandle(hfile);
170         if (!bRet)
171         {
172         RETAILMSG(1, (_T("ReadIniFile, ReadFile fail, err = [%d]\n"),GetLastError())); 
173         nReturn = 0;
174         goto exit;
175         }
176 
177         // Create the buffer.
178         if( g_pData )
179         {
180         free(g_pData);
181         g_pData = NULL;
182         }
183 
184         dwSize = MultiByteToWideChar( CP_ACP,0, (char *)pData ,-1,NULL,0);
185         g_pData = (TCHAR *)malloc(dwSize*sizeof(WCHAR));
186         
187         if(!g_pData)
188         {
189         RETAILMSG(1, (_T("ReadIniFile, no enough momery\n")));
190         nReturn = 0;
191         goto exit;
192         }
193         MultiByteToWideChar(CP_ACP,0,(char *)pData,-1,g_pData,dwSize);
194 
195         dwSize--; // includes the NULL termination character
196         nReturn = dwSize;
197         }
198 
199     exit:
200     if(pData)
201     {
202     free(pData);
203     pData = NULL;
204     }
205     if(hfile)
206     {
207     CloseHandle(hfile);
208     hfile = NULL;
209     }
210     return nReturn;
211 }
212 
213 
214 /************************************************************************
215 ** 函数:GetLine
216 **功能:获取在g_pData中从dwOffset位置开始的一行数据并保存到pLine,同时把偏移量dwOffset
217 移 到下一行行首
218 **参数:
219 pLine[out]   - 接收一行数据(不包括\r\n)
220 dwOffset[in] - 要读取的那一行的开始位置
221 dwSize[in]   - INI文件大小
222 **返回:
223 正确 - 下一行行首的位置
224 错 误 - 0
225 **作者:XZP
226 **日期:07.12.7
227 **备注:
228 /************************************************************************/
229 DWORD GetLine(LPWSTR pLine, DWORD dwOffset, DWORD dwSize)
230 {
231     DWORD len = 0;
232     DWORD len2 = 0;
233     // Look for the end of the line.
234     while ( dwOffset + len < dwSize&& '\r' != g_pData[dwOffset+len] && '\n' != g_pData[dwOffset+len])
235     {
236         if( g_pData[dwOffset+len]==0 )
237         break;
238         pLine[len] = g_pData[dwOffset+len] ;
239         ++len;
240     }
241 
242     pLine[len] = 0 ;
243     // Now push the internal offset past the newline.
244     // (We assume \r\n pairs are always in this order)
245     if (dwOffset + len + len2 < dwSize && '\r' == g_pData[dwOffset+len+len2])
246     ++len2;
247     if (dwOffset + len + len2+1 < dwSize && '\n' == g_pData[dwOffset+len+len2])
248     ++len2;
249     if (2 >= len + len2 && (dwOffset +2 >=dwSize) )
250     return 0;
251 
252     dwOffset += len + len2;
253     return dwOffset;
254 }
255 
256 /************************************************************************
257 ** 函数:IsComment
258 **功能:判断是不是注释行
259 **参数:
260 pLine[in] - INI的一行数据
261 **返 回:
262 1 - 注释行
263 0 - 不是注释行
264 **备注:
265 1). 空行也视为注释行
266 ************************************************************************/
267 BOOL IsComment(LPCWSTR pLine) 
268 {
269     if (!pLine || 0 == wcslen(pLine) || ';' == *pLine)
270     return TRUE;
271     return FALSE;
272 }
273 
274 /************************************************************************
275 ** 函数:IsSection
276 **功能:判断是不是段名
277 **参数:
278 pLine[in] - INI的一行数据
279 **返回:
280 1 - 是段名
281 0 - 不是
282 ************************************************************************/
283 BOOL IsSection(LPCWSTR pLine)
284 {
285     if (pLine && '[' == *pLine)
286     return TRUE;
287     return FALSE;
288 }
289 
290 /************************************************************************
291 ** 函数:IsSectionName
292 **功能:判断是INI文件的一行(pLine)是不是我们要找的段名(pSection)
293 **参数:
294 pLine[in]    - INI文件的一行数据
295 pSection[in] - 要找的段名
296 **返回:
297 1 - 是
298 0 - 不是
299 ** 备注:
300 ************************************************************************/
301 BOOL IsSectionName(LPCWSTR pLine, LPCWSTR pSection)
302 {
303     if (IsSection(pLine))
304     {
305         DWORD len = wcslen(pSection);
306         if (wcslen(pLine) - 2 == len && 0 == _wcsnicmp(pLine+1, pSection, len))
307         return TRUE;
308     }
309     return FALSE;
310 }
311 
312 /************************************************************************
313 ** 函数:IsKey
314 **功能:判断INI文件中一行的数据是不是我们要找的键名,如果是并读取键值
315 **参数:
316 pLine[in] - INI文件某行数据
317 pKeyName[in] - 要寻找的键名
318 pValue[out] - 键值
319 dwValLen[out] - 键值pValue大小(in bytes)
320 **返回:
321 1 - 是,同时pValue返回键值
322 0 - 不是,pValue为NULL
323 **作者:XZP
324 **日期:07.12.9
325 **备注:
326 ************************************************************************/
327 BOOL IsKey(LPCWSTR pLine , LPCWSTR pKeyName, LPWSTR* pValue, DWORD* dwValLen )
328 {
329     LPCWSTR pEqual = NULL;
330     DWORD length = 0, len = 0;
331 
332      if(!pLine || !pKeyName)
333     return FALSE;
334 
335     // pLine是不是注释行
336     if (IsComment( pLine ))
337     return FALSE;
338 
339     // 寻找"="号
340     pEqual = wcschr(pLine, L'=' );
341     if (!pEqual)
342     return FALSE;
343 
344      // 寻找键名最后一字符的位置
345     while (pEqual - 1 >= pLine && iswspace(*(pEqual-1)))
346     --pEqual;
347     
348     // Badly formed file.
349     if (pEqual - 1 < pLine)
350     return FALSE;
351 
352     // 键名长度
353     length = pEqual - pLine;
354 
355     len = wcslen(pKeyName);
356     //if (len == length && 0 == _wcsnicmp(pLine, pKeyName, len))
357     if ( 0 == _wcsnicmp(pLine, pKeyName, len))
358     {
359         *pValue = (LPWSTR)wcschr(pLine, '=' );
360         ++(*pValue);
361         *dwValLen = wcslen(pLine) - ((*pValue) - pLine);
362 
363           // 去掉紧跟在"="号后的所有空格
364         while (0 < *dwValLen && iswspace(**pValue))
365         {
366         ++(*pValue);
367         --(*dwValLen);
368         }
369         while (0 < *dwValLen && iswspace((*pValue)[*dwValLen-1]))
370         {
371         --(*dwValLen);
372         }
373         // If the string is surrounded by quotes, remove them.
374         if ('"' == (**pValue))
375         {
376         ++(*pValue);
377         --(*dwValLen);
378         if ('"' == (*pValue)[*dwValLen-1])
379         {
380         --(*dwValLen);
381         }
382         }
383         return TRUE;
384     }
385     else
386     {
387     *pValue = NULL;
388     return FALSE;
389     }
390 }
391 
392 
393 /************************************************************************
394 ** 函数:GetPrivateProfileString
395 **功能:WCE下读取INI文件中某段名/键名的键值的字符串
396 **参数:
397 lpAppName[in]         - points to section name
398 lpKeyName[in]         - points to key name
399 lpDefault[in]         - points to default string
400 lpReturnedString[out] - points to destination buffer
401 nSize[in]             - size of destination buffer "lpReturnedString"(in characters)
402 lpFileName[in]        - points to initialization filename 
403 **返回:The return value is the number of characters copied to the buffer, 
404 not including the terminating null character.   
405 **作者:XZP
406 **日期:07.12.11
407 **备注:
408 1). 如果INI文件没有你关心的数据,返回默认值lpDefault
409 ************************************************************************/
410 DWORD GetPrivateProfileString(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPCWSTR lpDefault, LPWSTR  lpReturnedString,DWORD Size,LPCWSTR lpFileName )
411 {
412     DWORD dwRc = 0, dwReturn = 0;
413     if(!lpAppName || !lpKeyName || !lpReturnedString || !lpFileName || Size<=0 )
414     return 0;
415 
416      dwRc = GetString(lpAppName,lpKeyName,lpReturnedString,Size,lpFileName);
417     if(dwRc != 0)
418     {
419         dwReturn = dwRc;
420     }
421     else
422     {
423         if(lpDefault)
424         {
425         wcsncpy(lpReturnedString, lpDefault, Size);
426         lpReturnedString[Size-1] = NULL;
427         }
428         else
429         *lpReturnedString = 0;
430         dwReturn = wcslen(lpReturnedString);
431     }
432 
433      // 释放内存
434     if (NULL != g_pData)
435     {
436         free( g_pData );
437         g_pData = NULL;
438     }
439 
440      return dwReturn;
441 }
442 
443 /************************************************************************
444 ** 函数:GetPrivateProfileInt
445 **功能: retrieves an integer associated with a key in the
446 specified section of the given initialization file
447 ** 参数:
448 LPCTSTR lpAppName,  // address of section name
449 LPCTSTR lpKeyName,  // address of key name
450 INT nDefault,       // return value if key name is not found
451 LPCTSTR lpFileName  // address of initialization filename
452 **返回:
453 The return value is the integer equivalent of the string following 
454 the specified key name in the specified initialization file. If the 
455 key is not found, the return value is the specified default value. 
456 If the value of the key is less than zero, the return value is zero. 
457 **作者:XZP
458 **日期:07.12.11
459 ** 备注:
460 ************************************************************************/
461 UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName, INT nDefault,LPCTSTR lpFileName )
462 {
463     WCHAR szRet[80] ={0};
464 
465      if(!lpAppName || !lpKeyName || !lpFileName )
466     return 0;
467 
468     DWORD cch = GetString(lpAppName, lpKeyName, szRet, sizeof(szRet)/sizeof(WCHAR), lpFileName);
469 
470      // 释放内存
471     if (NULL != g_pData)
472     {
473         free( g_pData );
474         g_pData = NULL;
475     }
476 
477      if (cch)
478     return _wtoi(szRet);
479     else
480     return nDefault; 
481 }
482 
483 /************************************************************************
484 ** 函数:WriteLine
485 **功能:向文件写入一行数据(包括回车换行符)
486 **参数:
487 hOutput[in] - 已打开的文件句柄
488 pLine[in]   - 要写入的一行数据
489 **返回:NONE
490 **作者:XZP
491 **日 期:08.1.2
492 **备注:
493 1). 写入一行数据,也包括写入行末的"\r\n"两个字符
494 2). 注意区分是不是UNICODE版本的INI文件,如果不是,要将WCHAR转为char再写入INI文件
495 3). 注意不要将结束符也写入文件
496 ************************************************************************/
497 void WriteLine(HANDLE hOutput , LPCWSTR pLine)
498 {
499     DWORD dwWrote = 0;
500     WCHAR wBuffer[MAX_PATH] = {0};
501     char buffer[MAX_PATH] ={0};
502     DWORD dwlen = wcslen(pLine) ;
503     BOOL bUnicode = FALSE ;
504 
505     if(bUnicode)
506     {
507         if (pLine)
508         {
509         WriteFile(hOutput, pLine, wcslen(pLine)*sizeof(WCHAR), &dwWrote, NULL);
510         WriteFile(hOutput, L"\r\n", 2*sizeof(WCHAR), &dwWrote, NULL);
511         }
512     }
513     else
514     {
515         if (pLine)
516         {
517         int bsize ;
518         TCHAR szTempLine[MAX_PATH] = {0} ;
519         wcsncpy( szTempLine, pLine, dwlen);
520 
521         bsize=WideCharToMultiByte(CP_ACP,0,szTempLine,-1,NULL,0,NULL,NULL);
522         WideCharToMultiByte(CP_ACP,0,szTempLine,-1,buffer, bsize,NULL,NULL);
523         buffer[bsize] = 0 ;
524 
525         WriteFile(hOutput, buffer, bsize-1 , &dwWrote, NULL); // 注意不要将结束符也写入
526         WriteFile(hOutput, "\r\n", 2, &dwWrote, NULL);
527         }
528     }
529 }
530 
531 /************************************************************************
532 ** 函数:WritePrivateProfileString
533 **功能:WCE环境下,向指定INI文件指定段名写入字符串数据
534 **参数:
535 lpAppName[in]
536 Pointer to a null-terminated string containing section name. If
537 the section does not exit, it is created.
538 lpKeyName[in]
539 Pointer to a null-terminated string containing key name. If the
540 key does not exit in the specified section pointed to by the lpAppName 
541 parameter, it's created. If this parameter is NULL, the ertire section, 
542 including all keys within the section, is deleted. When deleting a 
543 section, leave the comments intact.
544 lpString[in]
545 pointer to a null-terminated string to be written to the file. 
546 If this parameter is NULL, the key pointed to by the lpKeyName 
547 parameter is deleted.
548 lpFileName[in]
549 Pointer to a null-terminated string that names the initialization file. 
550 **返回:
551 FALSE - fail
552 TRUE  - success
553 **作者:XZP
554 **日期:08.1.17
555 **备注:
556 1). 先将要修改的INI文件的全部数据读取到全局内存g_pData中
557 2). 在g_pData中定位到我们要修改的位置,将其它数据和我们修改的数据写入一临时ini文件
558 3). 最后将临时ini文件覆盖原来的ini文件,再删除临时ini文件
559 4). 主要的API函数:
560 CreateFile、 ReadFile、WriteFile、SetEndOfFile、CopyFile、DeleteFile
561 5). 如果lpKeyName == NULL, 删除整个段, 如果lpString == NULL, 删除健
562 ************************************************************************/
563 BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName)
564 {
565     DWORD dwSize, dwOffset;                // dwSize - ini文件大小, dwOffset - 偏移量
566     BOOL  bReadLine = TRUE;
567     BOOL  bWrote = FALSE;
568     TCHAR pszLine[MAX_PATH] = {0};         // 存储一行的数据
569     TCHAR pszIniFileTemp[MAX_PATH] = {0};  // 临时ini文件的名称(包括路径)
570     HANDLE hOutputFile ;
571     LPWSTR pValue;
572     DWORD dwValLen;
573     LPWSTR pName;
574     RETAILMSG(1, (TEXT("WritePrivateProfileString  start!")));
575     dwOffset = 0;
576     if (!lpFileName)
577     return FALSE;
578 
579      // 读取INI文件内容到全局变量g_pData内存中
580     dwSize = ReadIniFile(lpFileName);
581 
582      //RETAILMSG(1, (TEXT("lpFileName=[%s], dwSize=[%d]"), lpFileName, dwSize));
583 
584     // Create the output file.
585     //wcscpy(pszIniFileTemp, lpFileName);
586     pName = (LPWSTR)_tcsrchr(lpFileName, L'\\');
587     RETAILMSG(1, (TEXT("WritePrivateProfileString  2222!")));
588     if(pName)
589     {
590         pName++;
591         wsprintf(pszIniFileTemp,TEXT("\\My Documents\\%s.tmp"),pName);
592     }
593     else
594     { 
595         wsprintf(pszIniFileTemp, TEXT("\\My Documents\\%s.ini.tmp"),lpAppName);
596     }
597     RETAILMSG(1, (TEXT("pszIniFileTemp is %s !"),pszIniFileTemp));
598      hOutputFile = CreateFile(pszIniFileTemp,GENERIC_WRITE,0,(LPSECURITY_ATTRIBUTES)0, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
599      
600      RETAILMSG(1, (TEXT("WritePrivateProfileString  4444!")));
601     if (INVALID_HANDLE_VALUE == hOutputFile)
602     {
603         RETAILMSG(1, (TEXT("Could not open output file: %s\n"), pszIniFileTemp));
604         return FALSE;
605     }
606     RETAILMSG(1, (TEXT("WritePrivateProfileString  5555!")));
607     // 将所有数据写入临时ini文件
608 
609     for (;;)
610     {
611         // The bReadLine flag is used to not read a new line after we break
612         // out of the inner loop. We've already got a line to process.
613         if (bReadLine)
614         {
615             dwOffset = GetLine( pszLine , dwOffset , dwSize );
616             if (!dwOffset)
617             break;
618         }
619         bReadLine = TRUE;
620         // Skip past comments.
621         if (IsComment(pszLine))
622         {
623             WriteLine(hOutputFile , pszLine);
624             continue;
625         }
626         // Found a section name.
627         if (IsSection(pszLine))
628         {
629             RETAILMSG(1, (TEXT("WritePrivateProfileString  6666!")));
630             // It's the section we want.
631             if (IsSectionName(pszLine , lpAppName))
632             {
633                 RETAILMSG(1, (TEXT("WritePrivateProfileString  7777!")));
634                 // 以下如果lpKeyName为NULL,删除整个段
635                 if (lpKeyName)
636                 WriteLine(hOutputFile , pszLine);
637 
638                 // Process the whole section.
639                 while (0 != (dwOffset = GetLine( pszLine , dwOffset , dwSize )))
640                 {
641                     
642                     // Reached the end of the section.
643                     if (IsSection(pszLine))
644                     {
645                         bReadLine = FALSE;
646                         // This line will be written in the outer loop.
647                         break;
648                     }
649                     // When deleting a section, leave the comments intact.
650                     else if (IsComment(pszLine))
651                     {
652                         WriteLine(hOutputFile , pszLine);
653                         continue;
654                     }
655                     // Got the value we want.
656                     if (!bWrote && IsKey(pszLine , lpKeyName, &pValue, &dwValLen))
657                     {
658                         RETAILMSG(1, (TEXT("WritePrivateProfileString  8888!")));
659                         bWrote = TRUE;
660                         // 如果lpString为NULL,删除健lpKeyName
661                         if(lpString)
662                         WriteValue(hOutputFile , NULL, lpKeyName, lpString);
663                     }
664                     else
665                     {
666                         if (lpKeyName)
667                         WriteLine(hOutputFile , pszLine);
668                     }
669 
670                     if(dwOffset >= dwSize)
671                     break ;
672                 }
673 
674                 // 如果在段名lpAppName下键名lpKeyName不存在,则新建键名lpKeyName和键值lpString
675                 if (!bWrote)
676                 {
677                     RETAILMSG(1, (TEXT("WritePrivateProfileString  9999!")));
678                 bWrote = TRUE;
679                 WriteValue(hOutputFile, NULL, lpKeyName, lpString);
680                 }
681             }
682             else
683             WriteLine(hOutputFile , pszLine);
684         }
685         else
686         WriteLine(hOutputFile , pszLine);
687 
688         if(dwOffset ==0) 
689         break;
690     }
691 
692 
693      // 如果指定的段名lpAppName不存在,则新建段名lpAppName及键名lpKeyName和键值lpString
694     if (!bWrote && lpKeyName && lpString)
695     {
696          RETAILMSG(1, (TEXT("WritePrivateProfileString  aaaaaa!  \n")));
697         WriteValue(hOutputFile , lpAppName, lpKeyName, lpString);
698     }
699 
700      // 用临时ini文件覆盖原来的ini文件并删除临时ini文件
701     if (INVALID_HANDLE_VALUE != hOutputFile)
702     {
703          RETAILMSG(1, (TEXT("WritePrivateProfileString bbbbbb!  \n")));
704         SetEndOfFile(hOutputFile );
705         CloseHandle(hOutputFile);
706         RETAILMSG(1, (TEXT("WritePrivateProfileString  cccccc! %d \n"),CopyFile(pszIniFileTemp,lpFileName,0)));
707         DeleteFile(pszIniFileTemp);
708         return 1;
709          
710     }
711 
712     // 释放ReadIniFile函数的全局内存
713     if (NULL != g_pData)
714     {
715         free( g_pData ) ;
716         g_pData = NULL ;
717     }
718      RETAILMSG(1, (TEXT("WritePrivateProfileString  OK!")));
719      return TRUE;
720 }
721 
722 /************************************************************************
723 ** 函数:WritePrivateProfileInt
724 **功能:WCE环境下,向指定INI文件指定段名写入整型数据
725 **参数:参考 WritePrivateProfileString函数
726 **返回:
727 FALSE - fail
728 TRUE  - success
729 **备注:
730 ************************************************************************/
731 BOOL WINAPI WritePrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT Value,LPCTSTR lpFileName)
732 {   
733     TCHAR ValBuf[16]={0};    
734     wsprintf( ValBuf, TEXT( "%i" ), Value);    
735     RETAILMSG(1, (TEXT("ValBuf is %i"),ValBuf));
736     return( WritePrivateProfileString(lpAppName, lpKeyName, ValBuf, lpFileName) ); 
737 }
738 
739 /************************************************************************
740 ** 函数:WriteValue
741 **功能:向指定INI文件中写入段名、键名和键值
742 **参数:
743 m_hOutput[in]
744 pointer to the handle of ini file.
745 pAppName[in]
746 Pointer to a null-terminated string containing the name of the section
747 in which data is written. If this parameter is NULL, the WriteValue
748 function just wirte the pKeyName and pString.
749 pKeyName[in]
750 Pointer to a null-terminated string containing the name of the key in
751 which data is writtern. 
752 pString[in]
753 Pointer to a null-terminated string to be written to the file. 
754 **返回:NONE
755 **作者:XZP
756 **日 期:08.1.18
757 **备注:
758 1). 要成功写入INI文件,键名pKeyName和键值pString都不能为NULL。
759 2). 如果段名pAppName为NULL,则只写入键名pKeyName和键值pString。
760 3). 注意往INI文件写入字符串时,不要写入结束符。
761 ************************************************************************/
762 void WriteValue(HANDLE m_hOutput, LPCWSTR pAppName, LPCWSTR pKeyName, LPCWSTR pString)
763 {
764     char buffer[MAX_PATH] = {0} ;
765     DWORD dwWrote;
766     BOOL m_bUnicode = FALSE ;
767 
768     if (pKeyName && pString)
769     {
770         //RETAILMSG( 1 , (TEXT("pKeyName : %s , pString : %s"), pKeyName , pString) ) ;
771 
772         if (pAppName)  // 写入段名
773         {
774             if (m_bUnicode)
775             {
776                 WriteFile(m_hOutput, L"[", sizeof(WCHAR), &dwWrote, NULL);
777                 WriteFile(m_hOutput, pAppName, wcslen(pAppName)*sizeof(WCHAR), &dwWrote, NULL);
778                 WriteFile(m_hOutput, L"]\r\n", 3*sizeof(WCHAR), &dwWrote, NULL);
779             }
780             else
781             {
782                 int bsize , iRetLen;
783                 TCHAR szTempLine[256] ={0} ;
784 
785                 wcscpy( szTempLine , TEXT("[") ) ;
786                 wcscat( szTempLine , pAppName ) ;
787                 wcscat( szTempLine , TEXT("]") ) ;
788 
789                 bsize=WideCharToMultiByte(CP_ACP,0,szTempLine,-1,NULL,0,NULL,NULL);
790                 iRetLen = WideCharToMultiByte(CP_ACP,0,szTempLine,-1,buffer, bsize,NULL,NULL);
791                 buffer[bsize] = 0 ;
792 
793                 WriteFile(m_hOutput, buffer , bsize-1 , &dwWrote, NULL);
794                 WriteFile(m_hOutput, "\r\n", 2, &dwWrote, NULL);
795 
796             }
797         }
798 
799         if (m_bUnicode)  // 写入健名和键值
800         {
801             WriteFile(m_hOutput, pKeyName, wcslen(pKeyName)*sizeof(WCHAR), &dwWrote, NULL);
802             WriteFile(m_hOutput, L"=", sizeof(WCHAR), &dwWrote, NULL);
803             WriteFile(m_hOutput, pString, wcslen(pString)*sizeof(WCHAR), &dwWrote, NULL);
804             WriteFile(m_hOutput, L"\r\n", 2*sizeof(WCHAR), &dwWrote, NULL);
805         }
806         else
807         {   
808             int bsize , iRetLen;
809             TCHAR szTempLine[256] ={0} ;
810 
811             wcscpy( szTempLine , pKeyName ) ;
812             wcscat( szTempLine , TEXT("=") ) ;
813             wcscat( szTempLine , pString )  ;
814 
815             bsize=WideCharToMultiByte(CP_ACP,0,szTempLine,-1,NULL,0,NULL,NULL);
816             iRetLen = WideCharToMultiByte(CP_ACP,0,szTempLine,-1,buffer, bsize,NULL,NULL);
817             buffer[bsize] = 0 ;
818 
819             WriteFile(m_hOutput, buffer, bsize-1 , &dwWrote, NULL);
820             WriteFile(m_hOutput, "\r\n", 2, &dwWrote, NULL);
821         }
822     }
823 }


 

下面是我所使用的过程:首先是初始化时读:

  1 CString name[38];
  2     CString APPname1,APPname2;
  3     CString lpFileName;
  4     APPname1.Format(_T("radio"));
  5     lpFileName.Format(_T("\\My Documents\\MMC.ini"));
  6     name[0].Format(_T("m_first_run_flag"));
  7     name[1].Format(_T("m_current_freq"));
  8     name[2].Format(_T("m_current_band"));
  9     name[3].Format(_T("m_current_channel"));
 10     name[4].Format(_T("m_current_ST"));
 11     name[5].Format(_T("m_channel_freq0"));
 12     name[6].Format(_T("m_channel_freq1"));
 13     name[7].Format(_T("m_channel_freq2"));
 14     name[8].Format(_T("m_channel_freq3"));
 15     name[9].Format(_T("m_channel_freq4"));
 16     name[10].Format(_T("m_channel_freq5"));
 17     name[11].Format(_T("m_channel_freq6"));
 18     name[12].Format(_T("m_channel_freq7"));
 19     name[13].Format(_T("m_channel_freq8"));
 20     name[14].Format(_T("m_channel_freq9"));
 21     name[15].Format(_T("m_channel_freq10"));
 22     name[16].Format(_T("m_channel_freq11"));
 23     name[17].Format(_T("m_channel_freq12"));
 24     name[18].Format(_T("m_channel_freq13"));
 25     name[19].Format(_T("m_channel_freq14"));
 26     name[20].Format(_T("m_channel_freq15"));
 27     name[21].Format(_T("m_channel_freq16"));
 28     name[22].Format(_T("m_channel_freq17"));
 29     name[23].Format(_T("m_SW_LOC"));
 30     name[24].Format(_T("m_cur_PTY"));
 31     name[25].Format(_T("m_set_PTY"));
 32     name[26].Format(_T("m_manual_flag"));
 33     name[27].Format(_T("m_NO_PTY_flag"));
 34     name[28].Format(_T("m_SW_ST"));
 35     name[29].Format(_T("m_SW_TA"));
 36     name[30].Format(_T("m_SW_AF"));
 37     name[31].Format(_T("m_SW_EON"));
 38     name[32].Format(_T("m_SW_REG"));
 39     name[33].Format(_T("m_cur_TA"));
 40     name[34].Format(_T("m_cur_TP"));
 41     name[35].Format(_T("m_cur_EON"));
 42     name[36].Format(_T("m_flick_TA"));
 43     name[37].Format(_T("m_flick_AF"));
 44     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[0],0,lpFileName ), CRadioData::DATA_CUR_STATE);
 45     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[1],0,lpFileName ), CRadioData::DATA_CUR_FREQ);
 46     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[2],0,lpFileName ), CRadioData::DATA_CUR_BAND);
 47     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[3],0,lpFileName ), CRadioData::DATA_CUR_CH);
 48     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[4],0,lpFileName ), CRadioData::DATA_CUR_ST);
 49     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[5],0,lpFileName ), CRadioData::DATA_CH1);
 50     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[6],0,lpFileName ), CRadioData::DATA_CH2);
 51     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[7],0,lpFileName ), CRadioData::DATA_CH3);
 52     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[8],0,lpFileName ), CRadioData::DATA_CH4);
 53     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[9],0,lpFileName ), CRadioData::DATA_CH5);
 54     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[10],0,lpFileName ), CRadioData::DATA_CH6);
 55     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[11],0,lpFileName ), CRadioData::DATA_CH7);
 56     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[12],0,lpFileName ), CRadioData::DATA_CH8);
 57     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[13],0,lpFileName ), CRadioData::DATA_CH9);
 58     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[14],0,lpFileName ), CRadioData::DATA_CH10);
 59     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[15],0,lpFileName ), CRadioData::DATA_CH11);
 60     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[16],0,lpFileName ), CRadioData::DATA_CH12);
 61     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[17],0,lpFileName ), CRadioData::DATA_CH13);
 62     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[18],0,lpFileName ), CRadioData::DATA_CH14);
 63     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[19],0,lpFileName ), CRadioData::DATA_CH15);
 64     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[20],0,lpFileName ), CRadioData::DATA_CH16);
 65     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[21],0,lpFileName ), CRadioData::DATA_CH17);
 66     CRadioData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname1,name[22],0,lpFileName ), CRadioData::DATA_CH18);
 67     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[23],0,lpFileName ), CRadioData::DATA_SW_LOC);
 68     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[24],0,lpFileName ), CRadioData::DATA_CUR_PTY);
 69     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[25],0,lpFileName ), CRadioData::DATA_SET_PTY);
 70     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[26],0,lpFileName ), CRadioData::DATA_MANUAL_FLAG);
 71     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[27],0,lpFileName ), CRadioData::DATA_NO_PTY);
 72     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[28],0,lpFileName ), CRadioData::DATA_SW_ST);
 73     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[29],0,lpFileName ), CRadioData::DATA_SW_TA);
 74     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[30],0,lpFileName ), CRadioData::DATA_SW_AF);
 75     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[31],0,lpFileName ), CRadioData::DATA_SW_EON);
 76     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[32],0,lpFileName ), CRadioData::DATA_SW_REG);
 77     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[33],0,lpFileName ), CRadioData::DATA_CUR_TA);
 78     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[34],0,lpFileName ), CRadioData::DATA_CUR_TP);
 79     CRadioData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname1,name[35],0,lpFileName ), CRadioData::DATA_CUR_EON);
 80     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[36],0,lpFileName ), CRadioData::DATA_FLICK_TA);
 81     CRadioData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname1,name[37],0,lpFileName ), CRadioData::DATA_FLICK_AF);
 82 
 83     APPname2.Format(_T("setup"));
 84     name[0].Format(_T("m_MCU_version"));
 85     name[1].Format(_T("m_disp_loud"));
 86     name[2].Format(_T("m_disp_eq"));
 87     name[3].Format(_T("m_disp_volume"));
 88     name[4].Format(_T("m_disp_mixvol"));
 89     name[5].Format(_T("m_disp_balance"));
 90     name[6].Format(_T("m_disp_fader"));
 91     name[7].Format(_T("m_disp_bass"));
 92     name[8].Format(_T("m_disp_middle"));
 93     name[9].Format(_T("m_disp_treble"));
 94     name[10].Format(_T("m_disp_subwoof"));
 95     name[11].Format(_T("m_mcu_time"));
 96     name[12].Format(_T("m_disp_mixact"));
 97     name[13].Format(_T("m_disp_loudc"));
 98     name[14].Format(_T("m_disp_bassc"));
 99     name[15].Format(_T("m_disp_middlec"));
100     name[16].Format(_T("m_disp_treblec"));
101     name[17].Format(_T("m_disp_bassq"));
102     name[18].Format(_T("m_disp_middleq"));
103     name[19].Format(_T("m_contrast"));
104     name[20].Format(_T("m_brightness"));
105     name[21].Format(_T("m_color"));
106 
107 
108     CCommonData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname2,name[1],0,lpFileName ), CCommonData::DATA_DISP_LOUD);
109     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[2],0,lpFileName ), CCommonData::DATA_DISP_EQ);
110     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[3],0,lpFileName ), CCommonData::DATA_DISP_VOLUME);
111     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[4],0,lpFileName ), CCommonData::DATA_DISP_MIXVOL);
112     CCommonData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname2,name[5],0,lpFileName ), CCommonData::DATA_DISP_BALANCE);
113     CCommonData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname2,name[6],0,lpFileName ), CCommonData::DATA_DISP_FADER);
114     CCommonData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname2,name[7],0,lpFileName ), CCommonData::DATA_DISP_BASS);
115     CCommonData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname2,name[8],0,lpFileName ), CCommonData::DATA_DISP_MIDDLE);
116     CCommonData::getInstance()->set_unchar_data(GetPrivateProfileInt(APPname2,name[9],0,lpFileName ), CCommonData::DATA_DISP_TREBLE);
117     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[10],0,lpFileName ), CCommonData::DATA_DISP_SUBWOOF);
118     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[11],0,lpFileName ), CCommonData::DATA_MCU_TIME);
119     CCommonData::getInstance()->set_bool_data(GetPrivateProfileInt(APPname2,name[12],0,lpFileName ), CCommonData::DATA_DISP_MIXACT);
120     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[13],0,lpFileName ), CCommonData::DATA_DISP_LOUDC);
121     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[14],0,lpFileName ), CCommonData::DATA_DISP_BASSC);
122     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[15],0,lpFileName ), CCommonData::DATA_DISP_MIDC);
123     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[16],0,lpFileName ), CCommonData::DATA_DISP_TREBLEC);
124     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[17],0,lpFileName ), CCommonData::DATA_DISP_BASSQ);
125     CCommonData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[18],0,lpFileName ), CCommonData::DATA_DISP_MIDDLEQ);
126     CSetupData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[19],0,lpFileName ), CSetupData::DATA_VIDEO_CONTRAST);
127     CSetupData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[20],0,lpFileName ), CSetupData::DATA_VIDEO_BRIGHTNESS);
128     CSetupData::getInstance()->set_unint_data(GetPrivateProfileInt(APPname2,name[21],0,lpFileName ), CSetupData::DATA_VIDEO_COLOR);
129     char *buff;
130     GetPrivateProfileString(APPname2,name[0],0, (LPWSTR)buff,20,lpFileName);
131     CCommonData::getInstance()->set_Cstring_data((LPWSTR)buff, CCommonData::DATA_MCU_VERSION);

其次是反初始化的写:

HANDLE hOutputFile ;
    CString pszIniFileTemp;
    pszIniFileTemp="\\My Documents\\MMC.ini.tmp";
    CString lpFileName;
    lpFileName.Format(_T("\\My Documents\\MMC.ini"));
    hOutputFile = CreateFile(pszIniFileTemp,GENERIC_WRITE,0,(LPSECURITY_ATTRIBUTES)0, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    CString APPname;
    APPname.Format(_T("radio"));
    CString name[38];
    CString keyval[38];
    int val[38];
    name[0].Format(_T("m_first_run_flag"));
    name[1].Format(_T("m_current_freq"));
    name[2].Format(_T("m_current_band"));
    name[3].Format(_T("m_current_channel"));
    name[4].Format(_T("m_current_ST"));
    name[5].Format(_T("m_channel_freq0"));
    name[6].Format(_T("m_channel_freq1"));
    name[7].Format(_T("m_channel_freq2"));
    name[8].Format(_T("m_channel_freq3"));
    name[9].Format(_T("m_channel_freq4"));
    name[10].Format(_T("m_channel_freq5"));
    name[11].Format(_T("m_channel_freq6"));
    name[12].Format(_T("m_channel_freq7"));
    name[13].Format(_T("m_channel_freq8"));
    name[14].Format(_T("m_channel_freq9"));
    name[15].Format(_T("m_channel_freq10"));
    name[16].Format(_T("m_channel_freq11"));
    name[17].Format(_T("m_channel_freq12"));
    name[18].Format(_T("m_channel_freq13"));
    name[19].Format(_T("m_channel_freq14"));
    name[20].Format(_T("m_channel_freq15"));
    name[21].Format(_T("m_channel_freq16"));
    name[22].Format(_T("m_channel_freq17"));
    name[23].Format(_T("m_SW_LOC"));
    name[24].Format(_T("m_cur_PTY"));
    name[25].Format(_T("m_set_PTY"));
    name[26].Format(_T("m_manual_flag"));
    name[27].Format(_T("m_NO_PTY_flag"));
    name[28].Format(_T("m_SW_ST"));
    name[29].Format(_T("m_SW_TA"));
    name[30].Format(_T("m_SW_AF"));
    name[31].Format(_T("m_SW_EON"));
    name[32].Format(_T("m_SW_REG"));
    name[33].Format(_T("m_cur_TA"));
    name[34].Format(_T("m_cur_TP"));
    name[35].Format(_T("m_cur_EON"));
    name[36].Format(_T("m_flick_TA"));
    name[37].Format(_T("m_flick_AF"));
    val[0]=CRadioData::getInstance()->get_unchar_data( CRadioData::DATA_CUR_STATE);
    val[1]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CUR_FREQ);
    val[2]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_CUR_BAND);
    val[3]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_CUR_CH);
    val[4]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_CUR_ST);
    val[5]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH1);
    val[6]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH2);
    val[7]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH3);
    val[8]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH4);
    val[9]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH5);
    val[10]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH6);
    val[11]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH7);
    val[12]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH8);
    val[13]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH9);
    val[14]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH10);
    val[15]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH11);
    val[16]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH12);
    val[17]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH13);
    val[18]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH14);
    val[19]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH15);
    val[20]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH16);
    val[21]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH17);
    val[22]=CRadioData::getInstance()->get_unint_data(CRadioData::DATA_CH18);
    val[23]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_SW_LOC);
    val[24]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_CUR_PTY);
    val[25]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_SET_PTY);
    val[26]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_MANUAL_FLAG);
    val[27]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_NO_PTY);
    val[28]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_SW_ST);
    val[29]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_SW_TA);
    val[30]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_SW_AF);
    val[31]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_SW_EON);
    val[32]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_SW_REG);
    val[33]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_CUR_TA);
    val[34]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_CUR_TP);
    val[35]=CRadioData::getInstance()->get_bool_data(CRadioData::DATA_CUR_EON);
    val[36]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_FLICK_TA);
    val[37]=CRadioData::getInstance()->get_unchar_data(CRadioData::DATA_FLICK_AF);
    int i;
    for(i=0;i<38;i++)
    {
    keyval[i].Format(_T("%d"),val[i]);
    }
    
    WriteValue(hOutputFile,APPname,name[0],keyval[0]);
    for(i=1;i<38;i++)
    {
    WriteValue(hOutputFile,0,name[i],keyval[i]);
    }

    APPname.Format(_T("setup"));
    name[0].Format(_T("m_MCU_version"));
    name[1].Format(_T("m_disp_loud"));
    name[2].Format(_T("m_disp_eq"));
    name[3].Format(_T("m_disp_volume"));
    name[4].Format(_T("m_disp_mixvol"));
    name[5].Format(_T("m_disp_balance"));
    name[6].Format(_T("m_disp_fader"));
    name[7].Format(_T("m_disp_bass"));
    name[8].Format(_T("m_disp_middle"));
    name[9].Format(_T("m_disp_treble"));
    name[10].Format(_T("m_disp_subwoof"));
    name[11].Format(_T("m_mcu_time"));
    name[12].Format(_T("m_disp_mixact"));
    name[13].Format(_T("m_disp_loudc"));
    name[14].Format(_T("m_disp_bassc"));
    name[15].Format(_T("m_disp_middlec"));
    name[16].Format(_T("m_disp_treblec"));
    name[17].Format(_T("m_disp_bassq"));
    name[18].Format(_T("m_disp_middleq"));
    name[19].Format(_T("m_contrast"));
    name[20].Format(_T("m_brightness"));
    name[21].Format(_T("m_color"));





    val[1]=CCommonData::getInstance()->get_bool_data(CCommonData::DATA_DISP_LOUD);
    val[2]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_EQ);
    val[3]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_VOLUME);
    val[4]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_MIXVOL);
    val[5]=CCommonData::getInstance()->get_unchar_data(CCommonData::DATA_DISP_BALANCE);
    val[6]=CCommonData::getInstance()->get_unchar_data(CCommonData::DATA_DISP_FADER);
    val[7]=CCommonData::getInstance()->get_unchar_data(CCommonData::DATA_DISP_BASS);
    val[8]=CCommonData::getInstance()->get_unchar_data(CCommonData::DATA_DISP_MIDDLE);
    val[9]=CCommonData::getInstance()->get_unchar_data(CCommonData::DATA_DISP_TREBLE);
    val[10]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_SUBWOOF);
    val[11]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_MCU_TIME);
    val[12]=CCommonData::getInstance()->get_bool_data(CCommonData::DATA_DISP_MIXACT);
    val[13]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_LOUDC);
    val[14]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_BASSC);
    val[15]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_MIDC);
    val[16]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_TREBLEC);
    val[17]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_BASSQ);
    val[18]=CCommonData::getInstance()->get_unint_data(CCommonData::DATA_DISP_MIDDLEQ);
    val[19]=CSetupData::getInstance()->get_unint_data(CSetupData::DATA_VIDEO_CONTRAST);
    val[20]=CSetupData::getInstance()->get_unint_data(CSetupData::DATA_VIDEO_BRIGHTNESS);
    val[21]=CSetupData::getInstance()->get_unint_data(CSetupData::DATA_VIDEO_COLOR);


    keyval[0].Format(_T("%s"),CCommonData::getInstance()->get_Cstring_data(CCommonData::DATA_MCU_VERSION));
    for(i=1;i<22;i++)
    {
    keyval[i].Format(_T("%d"),val[i]);
    }


    WriteValue(hOutputFile,APPname,name[0],keyval[0]);
    for(i=1;i<22;i++)
    {
    WriteValue(hOutputFile,0,name[i],keyval[i]);
    }
    
    SetEndOfFile(hOutputFile );
    CloseHandle(hOutputFile);
    RETAILMSG(1, (TEXT("WritePrivateProfileString  cccccc! %d \n"),CopyFile(pszIniFileTemp,lpFileName,0)));
    DeleteFile(pszIniFileTemp);

 需要注意的是,这样的保存并不适用与断电,因为是在内存文件夹

所以断电的话,我会把所有数据发送到MCU的eeprom,上电首先MCU会发给arm初始化信息

呵呵!算是给和我一样的新人一个提醒,不要随便擦写,特别是nand flash

文中并么有详细讲解代码,大家有何指教或疑问留言,我会一一回复的!共同进步!!!

免责声明:文章转载自《wince 基础技能 使用ini配置文件来保存信息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBoot整合Mybatis,TypeAliases配置失败的问题泛型(generic)的基本使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【VC++积累】之五、进程注入技术

注入:就是把我的代码,添加到已经远行的远程进程的方法; 在WinNT以后的系列操作系统中,每个进程都有自己的4GB私有进程地址空间,彼此互不相关。 如 :   进程A中的一个地址,比如:0x12345678,到了进程B中的相同地方,存的东西完全不一样,或者说不可预料。            所以说如果进程A想要看看或者修改进程B地址空间中的内容,就必须深入...

004.UDP--拼接UDP数据包,构造ip头和udp头通信(使用原始套接字)

一.大致流程: 建立一个client端,一个server端,自己构建IP头和UDP头,写入数据(hello,world!)后通过原始套接字(SOCK_RAW)将包发出去。 server端收到数据后,打印UDP数据并发送确认消息(yes),client收到yes后将其打印。 二.其中: client端IP:192.168.11.104 端口:8600 ser...

c语言获取linux的CPU、内存、IO、磁盘、网速(本机编译通过)

代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define MAXBUFSIZE 1024 #define WAIT...

Qt读写ini文件

一 背景 1 ini文件介绍 .ini 文件是Initialization File的缩写,即初始化文件。 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能。它可以用来存放软件信息,注册表信息等。 2 ini文件格式 IN...

Shiro笔记(三)----Shiro配置文件ini详解

一、INI简介INI配置文件是一种key/value的键值对配置,提供了分类的概念,每一个类中的key不可重复,#号代表注释,shiro.ini文件默认在/WEB-INF/ 或classpath下,shiro会自动查找,INI配置文件一般适用于用户少且不需要在运行时动态创建的情景下使用。1.在web.xml中配置shiro的过滤器要使用Shiro必须在we...

Delphi指针的用法

DELPHI指针的使用 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal,可以说在指针运用...