Windows 一般都存放在 ini 文件中。这种文件的格式可以说是分节的键值对这样。而windows 也提供了几组 API 来对这样的文件进行读写。

文件格式

INI 文件有三种形式的元素:节,参数,注释

每个节,单独占一行,以 [section] 形式展示。

参数

每个参数项包括一个键值对 key=value

注释

; 开始的内容。

实例

; last modified 1 April 2001 by John Doe  
[owner]
name=John Doe
organization=Acme Products
[database]
server=192.0.2.42
; use IP address in case network name resolution is not working
port=143
file = "acme payroll.dat"

API函数

函数有如下 {Get|Set}PrivateProfile{Int | String | Section | SectionNames}[A|W]。

BOOL WritePrivateProfileSectionA(
LPCSTR lpAppName,
LPCSTR lpString,
LPCSTR lpFileName
);

BOOL WritePrivateProfileSectionW(
LPCWSTR lpAppName,
LPCWSTR lpString,
LPCWSTR lpFileName
);

其中 lpAppName 指定节名称,lpString 指定 “key=value” 类似字符串,lpFileName 指定文件,如”.\\config.ini”

WritePrivateProfileSection(_T("acc1"), _T("password=1234"), m_szAccCfgName);

参数

BOOL WritePrivateProfileStringA(
LPCSTR lpAppName,
LPCSTR lpKeyName,
LPCSTR lpString,
LPCSTR lpFileName
);

BOOL WritePrivateProfileStringW(
LPCWSTR lpAppName,
LPCWSTR lpKeyName,
LPCWSTR lpString,
LPCWSTR lpFileName
);

这是对值中的某一项进行写入:

WritePrivateProfileString(_T("acc2"), _T("password"),_T("4567"), m_szAccCfgName);

获取所有节

DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer,
DWORD nSize,
LPCTSTR lpFileName
);

需要注意的是,返回的节是品在一起放在 lpszReturnBuffer 的,我们必须通过轮循的形式把他给取回来:

TCHAR buff[1024];
GetPrivateProfileSectionNames(buff,1024,_T(".\\config.ini"));
PTCHAR p = buff;
while (*p != NULL)
{
OutputDebugString(p);
p+= 1 + _tcslen(p);
}