技术开发 频道

在 WinCe 平台读写 ini 文件

  【IT168 技术】由于wince 平台上不支持例如 GetPrivateProfileString 等相关 API 函数。在网络上并没有找到令我满意的相应代码,因此本人手工自己写了相应的方法。命名规则是,在 PC API 函数的名称前面加上 “Ce” 前缀,这是为了在 PC 平台上调试和使用时,不和系统的 API 函数发生冲突。值得注意的是,在写 CeWritePrivateProfileString 方法时,如果改写后的 ini 文件应该比改写前的文件小,文件尾部将会是一些不确定内容(来自于原来文件)。在 PC 上我们可以通过 中的 _chsize 函数重新设置文件大小,但是很遗憾的是,这些底层的文件操作函数在 wince 平台上依然不被支持,但是幸运的是,可以使用 coredll.dll 中提供的 SetEndOfFile 函数去完成相同功能(感谢88上的 kghost 的提示)。

  另外我额外提供了一个函数:CeGetPrivateProfileKeyNames,用于读取某个 section 的所有 key 名称。

  当然,如果是在 PC 平台,我们就没有必要使用这里我所提供的代码,因为有系统 API 可以调用。

  需要注意的是,我提供的代码和 PC 端 API 相比,基本功能,参数意义完全相同,但具有以下一些额外要求:

  (1)大小写敏感。(当然也可以通过修改代码,令其大小写不敏感)

  (2)每一行,section, key, value, “=” 的前后不允许有空格。

  (3)注释行用英文分号“;"起始。允许存在空行。

  (4)每一行的字符数不能超过 260 字符(取决于代码中的宏定义)。

  (5)函数代码同时适用 unicode 和多字节字符串 的环境。

  (6)由于采用标准文件操作函数,因此 CeGetPrivateProfileSectionNames 函数并不保证原子性。(这一点和 PC API 不同)

  下面是相关函数代码:

  (a) IniFile.h

IniFile.h

  /***************************************

  * IniFile.h

  * 说明:在WinCe平台读写 INI 文件

  * by hoodlum1980

  * 2009.08.03

  ***************************************/

  #ifndef __INIFILE_H_BY_HOODLUM1980

  #define __INIFILE_H_BY_HOODLUM1980

  //是否在WINCE平台上

  #ifndef WINCE

  #define WINCE

  #endif

  #include "StdAfx.h"

  #ifndef WINCE

  #include //for _sopen

  #include //for _O_RDWT

  #include // for _SH_DENYRW

  #endif

  #ifdef UNICODE // r_winnt

  #define t_sopen _wsopen //注意WinCe上不支持!

  #define t_fopen _wfopen

  #define t_fgets fgetws

  #define t_fprintf fwprintf //文件格式化写入

  #define t_sprintf swprintf //格式化文本

  #define t_strcpy wcscpy

  #define t_strncpy wcsncpy //拷贝指定个数的字符

  #define t_strcat wcscat //append a string

  #define t_strtol wcstol

  #define t_strlen wcslen

  #define t_strcmp wcscmp

  #define t_stricmp _wcsicmp //忽略大小写的字符串比较

  #define t_strncmp wcsncmp //比较n个字符

  #define t_strchr wcschr //find a character in a string

  #define t_strrchr wcsrchr //从结尾向前查找字符

  #else //ASCII CODE

  #define t_sopen _sopen //注意WinCe上不支持!

  #define t_fopen fopen

  #define t_fgets fgets //读取一行文本

  #define t_fprintf fprintf //文件格式化写入

  #define t_sprintf sprintf //格式化文本

  #define t_strcpy strcpy

  #define t_strncpy strncpy //拷贝指定个数的字符

  #define t_strcat strcat //append a string

  #define t_strtol strtol //把字符串转换成long(int32)

  #define t_strlen strlen

  #define t_strcmp strcmp //比较字符串

  #define t_stricmp _stricmp //忽略大小写的字符串比较

  #define t_strncmp strncmp //比较n个字符

  #define t_strchr strchr //查找字符

  #define t_strrchr strrchr //从结尾向前查找字符

  #endif

  //CeWritePrivateProfileString 方法用到的辅助标记

  #define MODE_DELETE_SECTION 11

  #define MODE_OVERWRITE_SECTION 12

  #define MODE_APPEND_SECTION 13

  #define MODE_DELETE_KEY 21

  #define MODE_OVERWRITE_KEY 22

  #define MODE_APPEND_KEY 23

  #define LINESIZE 260 //行缓冲区大小

  DWORD CeGetPrivateProfileString(

  LPCTSTR lpAppName, //section name: [lpAppName]

  LPCTSTR lpKeyName, //lpKeyName=lpReturnedString

  LPCTSTR lpDefault, //未找到时的默认值

  LPTSTR lpReturnedString, //[out] 查找到的结果

  DWORD nSize, //[in]lpReturnedString的字符数,注意单位不是字节!

  LPCTSTR lpFileName

  );

  UINT CeGetPrivateProfileInt(

  LPCTSTR lpAppName,

  LPCTSTR lpKeyName,

  int nDefault,

  LPCTSTR lpFileName

  );

  DWORD CeGetPrivateProfileSection(

  LPCTSTR lpAppName,

  LPTSTR lpReturnedString,

  DWORD nSize,

  LPCTSTR lpFileName

  );

  DWORD CeGetPrivateProfileSectionNames(

  LPTSTR lpszReturnBuffer,

  DWORD nSize,

  LPCTSTR lpFileName

  );

  //在PC平台上可以调用_chsize函数调整文件大小,但是在WINCE平台上

  //由于不支持,所以必须注意当文件尺寸应该缩小时,文件尾部内容不确定!!!!

  BOOL CeWritePrivateProfileString(

  LPCTSTR lpAppName,

  LPCTSTR lpKeyName, //要修改的KEY,如果为NULL,会删除整个Section

  LPCTSTR lpString, //要写入的值,如果为NULL,则会删除这个KEY

  LPCTSTR lpFileName

  );

  //重写某个Section,注意和 PC API 的区别是,这里不保证原子性操作

  BOOL CeWritePrivateProfileSection(

  LPCTSTR lpAppName, //section name

  LPCTSTR lpString, //key1=val1 \0 key2=val2 \0\0

  LPCTSTR lpFileName

  );

  //==============================================

  // 以下是我增加的函数(在API中没有)

  //==============================================

  DWORD CeGetPrivateProfileKeyNames(

  LPCTSTR lpAppName,

  LPTSTR lpReturnedString,

  DWORD nSize, //缓冲区的字符数

  LPCTSTR lpFileName

  );

  #endif

0
相关文章