VC进程通信之:操作配置文件ini

来源:百度文库 编辑:神马文学网 时间:2024/04/29 02:28:49
http://hi.baidu.com/vcknow/blog/item/b23313d59b263bc450da4b74.html
2007-02-27 17:01
1 基础知识
INI文件(Initialization file ,又称为初始化文件)是用来保存应用程序设置和选项的一种特殊的ASCII文件,以“.ini”作为文件扩展名,也被称做配置文件或概要文件(Profile)。除了各个应用程序可以拥有自己私有的初始化文件外,Windows系统还提供有一个系统的初始化文件Win.ini,并由此对当前的Windows系统进行配置,同时也可以在其内记录系统内其他应用程序在运行时的选项。
通常为应用程序所私有的初始化文件比较小,这样可以减少程序在初始化时所读取的信息量,从而提高程序的启动速度。而系统初始化文件Win.ini由于除了记录有关系统的大量信息外,还存储着许多其他应用软件的初始化数据,因此其通常比较庞大,访问的数据量要远比私有的配置文件大得多。如没有必要,一般不建议对Win.ini文件进行操作,但如果待存取的信息涉及到Windows系统环境或是其他应用程序时, 就必须对Win.ini进行读写访问,并在访问的同时发送WM_WININICHANGE消息给所有的顶层窗口,通知其他进程系统初始化文件已被更改。
配置文件里的信息之所以能为系统和众多不同类型的应用程序读取并识别,是由于其内部对数据的存取采用了预先约定的“项-值对(Entry-value pairs)”存储结构, 并对待存取的数据分门别类地进行存储。下面是系统目录下Win.ini文件的部分内容:
[windows]
load=
run=
NullPort=None
[Desktop]
WallpaperStyle=2
Pattern=(无)
在此,配置文件将信息分为若干“节”,节标题放在方括号中,如“[Desktop]”就是Desktop节,在每一个节中包含了一些与之相关的“项”,并通过等号对其进行赋值。一般形式如下:
[SECTION]
ENTRY=VALUE
在初始化文件中,VALUE值只能有两种数据类型:数值和字符串。Windows分别为这两种数据类型提供了两套API函数对初始化文件进行数据读取,在写入初始化文件时则只支持对字符串的写入,数值等类型必须先进行数据类型的转换,然后才能写入到初始化文件。私有初始化文件的访问  对私有初始化文件的数据存取是由GetPrivateProfileInt()、GetPrivateProfileString()和WritePrivateProfileString()等三个API函数来完成的。其函数说明如下:
UINT GetPrivateProfileInt(LPCTSTR lpAppName, // 节名地址
LPCTSTR lpKeyName, // 项名地址
INT nDefault, // 在项名没有找到时返回的缺省值
LPCTSTR lpFileName // 初始化文件名地址
);
DWORD GetPrivateProfileString(LPCTSTR lpAppName, // 节名地址
LPCTSTR lpKeyName, // 项名地址
LPCTSTR lpDefault, // 缺省字符串
LPTSTR lpReturnedString, // 存放字符串的缓冲区地址
DWORD nSize, // 缓冲区大小
LPCTSTR lpFileName // 初始化文件名地址
);
BOOL WritePrivateProfileString(LPCTSTR lpAppName, // 节名地址
LPCTSTR lpKeyName, // 项名地址
LPCTSTR lpString, // 要写入的字符串地址
LPCTSTR lpFileName // 初始化文件名地址
);
其中,GetPrivateProfileInt()返回的是初始化文件lpFileName中lpAppName节内lpKeyName项的整数值,如果没有找到该项则返回缺省值nDefault。如果此项目存在,但值不为整数,则返回0。如果某项目的值中含有非数字字符则只返回第一个非数字前的字符,例如对于“Value = 21century”则只返回数值21。初始化文件名lpFileName可以是全路径也可以只是文件名,如果不指定具体路径,Windows系统将在系统目录对文件进行寻找。GetPrivateProfileString()和WritePrivateProfileString()的用法基本与之类似,只是处理对象的数据类型不同。
2 知识应用
私有初始化文件主要用来保存同应用程序当前状态相关的一些信息,当程序退出后,这些信息由于已写入到初始化文件而得以保留,当程序再次运行时,可以通过对此初始化文件各项数据的读取而得知此应用程序在上次运行期间的相关信息。下面这段代码即通过对私有初始化文件的访问而对程序的运行次数和上一次的运行日期进行记录:
CString sPath,sMsg,sTime,sDate;
char buffer[255];
// 获取当前应用程序全路径
GetModuleFileName(NULL, buffer, MAX_PATH);
sPath = CString(buffer);
sPath = sPath.Left(sPath.ReverseFind('\\'));
// 得到初始化文件的全路径
sPath += "\\Sample04.ini";
// 得到程序累计运行次数
UINT Time = GetPrivateProfileInt("PROGRAM", "RUNTIME", 0, sPath);
// 得到上次运行日期
GetPrivateProfileString("DATE", "LAST", "2002-11-1", buffer, 1000, sPath);
// 显示从初始化文件获取到的文件信息
sMsg.Format("本软件共运行过%d次,上次运行日期为%s", Time, CString(buffer));
AfxMessageBox(sMsg);
// 累加运行次数,并保存到初始化文件
Time++;
sTime.Format("%d", Time);
WritePrivateProfileString("PROGRAM", "RUNTIME", sTime, sPath);
// 获取当前日期,并保存到初始化文件
CTime tm = CTime::GetCurrentTime();
sDate.Format("%d-%d-%d", tm.GetYear(), tm.GetMonth(), tm.GetDay());
WritePrivateProfileString("DATE", "LAST", sDate, sPath);
在程序执行后,初始化文件Sample04.ini的内容为:
[DATE]
LAST =2002-11-12
[PROGRAM]
RUNTIME =1
系统目录下的Win.ini是一种特殊的初始化文件,主要为系统提供初始化服务,在系统启动时将被系统所访问,并根据其所保存的参数值对系统进行配置。Windows专门提供了三个API函数GetProfileInt()、GetProfileString()和WriteProfileString()对Win.ini进行读写访问,其函数用法同访问私有初始化文件的那几个函数非常类似,只是不必再去指定初始化文件名。下面是这三个函数的原型声明:
UINT GetProfileInt(LPCTSTR lpAppName, // 节名地址
LPCTSTR lpKeyName, // 项名地址
INT nDefault // 在项名没有找到时返回的缺省值
);
DWORD GetProfileString(LPCTSTR lpAppName, // 节名地址
LPCTSTR lpKeyName, // 项名地址
LPCTSTR lpDefault, // 缺省字符串地址
LPTSTR lpReturnedString, // 存放字符串的缓存的地址
DWORD nSize // 缓存的大小
);
BOOL WriteProfileString(LPCTSTR lpAppName, // 节名地址
LPCTSTR lpKeyName, // 项名地址
LPCTSTR lpString // 要写入字符串的地址
);
只要对前面对私有初始化文件进行访问的代码稍加改动即可将程序的配置信息添加到Win.ini中,改动后的代码如下:
CString sPath,sMsg,sTime,sDate;
// 得到程序累计运行次数
UINT Time = GetProfileInt("PROGRAM", "RUNTIME", 0);
// 得到上次运行日期
GetProfileString("DATE", "LAST", "2002-11-1", buffer, 1000);
// 显示从初始化文件获取到的文件信息
sMsg.Format("本软件共运行过%d次,上次运行日期为%s", Time, CString(buffer));
AfxMessageBox(sMsg);
// 累加运行次数,并保存到初始化文件
Time++;
sTime.Format("%d", Time);
WriteProfileString("PROGRAM", "RUNTIME", sTime);
// 获取当前日期,并保存到初始化文件
CTime tm = CTime::GetCurrentTime();
sDate.Format("%d-%d-%d", tm.GetYear(), tm.GetMonth(), tm.GetDay());
WriteProfileString("DATE", "LAST", sDate);
由于Win.ini文件是系统初始化文件,在程序没有运行前文件内不含“DATE”和“PROGRAM”等自定义的节以及其下各项,因此在程序第一次执行后,将由WriteProfileString()函数向Win.ini文件末尾创建相关节、项,并完成数据的写入。
(#)