📄 12.6.3 win.ini文件的读取.txt
字号:
12.6.3 Win.ini文件的读取
如果想要获取 Win .i ni文件中保存的初始化信息,可以利用 Win32 API提供的 GetProfile String
函数来实现。该函数的作用是获取初始化文件 Win .ini中的指定段下的一个字符串。该函数的声明
形式如下所示。
DWORD GetProfi1eString(
LPCTSTR 1pAppName,
LPCTSTR 1pKeyName,
LPCTSTR 1pDefau1t ,
LPTSTR 1pReturnedString,
DWORD nSize
可见, GetProfileString函数有五个参数,各参数的含义分别如下所述 :
. IpAppName
指向一个空终止的字符串的指针,该字符串指定含有所需键的段。
. IpKeyName
指向一个空终止的字符串的指针,该字符串包含了一个键的名称,与该键相关联的字符串将被获取。
. IpDefault
指向一个空终止的默认字符串。若参数 IpKeyName所指定的键不存在于 Win.ini文件中,则函数
GetProfileString将使用该默认字符串复制至参数 1 pReturnedString所指向的缓冲区中。
. IpReturnedString
指向一个缓冲区的指针,该缓冲区将接收获得的字符串。
. nSize
指定参数 IpReturnedString所指向的缓冲区的大小,单位是字节。
下面就在 File程序中利用 GetProfileString函数获取上面程序写 λWin .i ni文件中的信息。同样,
将这个操作放置到 CFileApp类的 Initlnstance函数中,先将上面如例 12-24所示代码中那条加灰
显示的 WriteProfileString函数调用注释起来,然后在其后添加如例 12-25所示代码。
例 12-25
CString str;
: : GetProfileString ("http://www . sunxin.org" , "admin" , "lisi",str.GetBuffer(100) , 100) ; AfxMessageBox(str) ;
在上述如例 12-25所示的代码中,首先定义了一个 CString对象:str,用来接收从 Win.ini文件中获
取的信息。接着调用 Win32 API提供的 GetProfileString函数获取上面程序写入 Win .ini文件中
的信息,并将键的默认值设置为 "lisi"。因为 GetProfileString函数的第四个参数需要的是一个
指向字符串的指针 (LPTSTR类型),正好 CString类的 GetBuffer函数
可以返回这种类型的值,所以直接调用该函数为这个参数传值。 GetBu仔er函数有一个参数,用于
指定字符串的长度,本例将此长度设置为 100。最后利用 AfxMessageBox函数显示读取到的数据。
在这里之所以使用全局函数: AfxMessageBox来显示消息框,是因为 CWinApp类并不是从 Wnd类派生
的,因此它没有 MessageBox函数。
运行 File程序,程序将弹出如图 12.16所示的消息框,可以看到程序从 Win .i ni文件中
获取到了正确的结果。
提示:当本例成功实现之后,读者应记得将自己机器上 Win.ini文件中自
己添加的内容删除了。
前面己经提到,在 CWinApp类中也有 WriteProfileString和 GetProfileString函数,那么它们与
Win32 API中相应函数有什么区别呢? CWinApp类的 WriteProfileString函数的声明形式如下所示:
BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue };
可以看到, CWinApp类提供的 WriteProfileString函数和 Win32 API提供的相应函数一样,也有三
个参数,分别指定将要写入的段名、项名和项的值。但是在不同的操作系统下,该函数实现的功能
不一样。在 Windows NT系统下,该函数将把信息存储到注册表中:在 Windows 3.x系统下,该函数
将把信息写入 wmini文件中:在 Windows 95系统下,该函数将把信息写入 win-ini文件的一个缓冲
版本中,主要是为了提升系统的性能。笔者使用的系统是 Windows 2000,所以调用 CWinApp类的
WriteProfI1eString函数之后,将把信息写入到注册表中,而不是 Win .i ni文件中。这与 Win32 API
提供的 WriteProfileString函数是有区别的。
下面就在 File程序中利用 CWinApp类的 WriteProfileString函数保存程序的初始信息。同样,将
这个操作放置到 CFileApp类的InitIn stance函数中,先将先前在该函数中添加的如例 12-25所示
代码全部注释起来,然后在 SetRegistryKey函数调用之后添加下面这条代码 :
食 WriteProfileString("http://www.sunxin.org", "admin", "zhangsan");
运行 File程序,然后用 regedit命令打开注册表,将会看到我们刚刚写入的信息位于:
HKEY_CURRENT_USER\SOFIWARE\Local AppWizard-Generated Applications\File子项下,如图
12.17所示。
读者可以发现注册表项: Local AppWizard-Generated Applications与 File程序中 SetRegis町Key
函数调用的参数值(可参照如例 12-24所示代码)完全一样,由此可见,
正是因为在该函数中指定的参数在注册表中才有这个工页。为了验证这一点,我们可以把
SetRegistryKey函数的参数替换为另一个字符串,例如替换为一个网址: http://www. suruin-org,
再次运行File程序,然后打开注册表,发现这时写入的信息保存在了HKEY CURRENT
USER\SOFI'WARE\http://www.sunxin.org \File子项下,如图 12.18所示。
图 12.17 CWinApp类的WriteProfileString函数调用结果
图 12.18改变SetRegis町lKey函数参数之后的信息保存位置
小技巧:按下键盘上的自键,可以刷新注册表编辑器的内容。
CWinApp类提供的GetProfileString函数的声明形式如下所示:
CString GetProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault =
NULL };
可以看到, CWinApp类提供的 GetProfileString函数有三个参数,分别指定将要读取的段名、项名
和项的默认值。该函数将返回从注册表中或从 Win.ini文件中获得的字符串。
下面,我们就在File程序中利用CWinApp类的GetProfùeS位ing函数从注册表中读取上面写入的信息。
同样,将这个操作放置到CFileApp类的InitInstance函数中,先将先前在该函数中添加的代码(即上
面,传符号所示的那行代码)注释起来,然后在SetRegis町Key
函数调用之后添加如例 12-26所示代码。
CString str;
str=GetProfileString ( " http: //www . sunxin . org", "admin" ) ;
AfxMessageBox(str) ;
在上述代码中,首先调用 CWinApp类提供的 GetProfùeS住ing函数获取先前写入注册表中的信息,
然后利用AfxMessageBox函数将获得的信息显示出来。读者可以运行一下 File程序,可以看到程序
将得到正确的信息。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -