一、ini文件及相关操作
ini文件用于保存应用程序的配置信息,内容以键值对的形式呈现,形如
[SECTION]
key=value
ini文件相关api(一部分):
BOOL WINAPI WriteProfileSection(
__in LPCTSTR lpAppName,
__in LPCTSTR lpString
);
BOOL WINAPI WriteProfileString(
__in LPCTSTR lpAppName, //节名
__in LPCTSTR lpKeyName, //键名
__in LPCTSTR lpString //值
);
BOOL WINAPI GetPrivateProfileStruct(
__in LPCTSTR lpszSection,
__in LPCTSTR lpszKey,
__out LPVOID lpStruct,
__in UINT uSizeStruct,
__in LPCTSTR szFile
);
DWORD WINAPI GetProfileString(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in LPCTSTR lpDefault, //默认值
__out LPTSTR lpReturnedString,
__in DWORD nSize
);
DWORD WINAPI GetProfileSection(
__in LPCTSTR lpAppName,
__out LPTSTR lpReturnedString,
__in DWORD nSize
);
BOOL WINAPI WritePrivateProfileString(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in LPCTSTR lpString,
__in LPCTSTR lpFileName //ini文件名(可填路径)
);
其中带private的是给用户自定义的ini文件使用的,不带private是给win.ini使用
二、注册表及相关操作
注册表是windows操作系统中的一个重要数据库,存储着系统和应用程序的配置信息。
1.创建注册表项:
LONG WINAPI RegCreateKeyEx(
__in HKEY hKey,
__in LPCTSTR lpSubKey, //新键(子项),要填路径
__reserved DWORD Reserved, //保留,填0
__in_opt LPTSTR lpClass, //可忽略,填NULL
__in DWORD dwOptions,
__in REGSAM samDesired,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性
__out PHKEY phkResult, //回传参数,项的句柄指针
__out_opt LPDWORD lpdwDisposition //可忽略,填NULL
);
函数成功返回ERROR_SUCCESS,失败返回错误码
第一个参数hkey是注册表项的句柄,表明要创建的项位于以下其中一个之下
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
第5个参数dwOptions是一个属性参数,可为以下之一:
REG_OPTION_NON_VOLATILE表示重启后项仍存在,REG_OPTION_VOLATILE则表示重启后不保留。
第六个参数samDesired 用于指定注册表安全和访问权限,其值有如下:
使用完毕后需要关闭注册表项的句柄:
LONG WINAPI RegCloseKey(
__in HKEY hKey
);
2.打开句柄:
LONG WINAPI RegOpenKeyEx(
__in HKEY hKey,
__in_opt LPCTSTR lpSubKey,
__reserved DWORD ulOptions,
__in REGSAM samDesired,
__out PHKEY phkResult
);
3.设置注册表项下指定值的数据和类型:
LONG WINAPI RegSetValueEx(
__in HKEY hKey, //句柄
__in_opt LPCTSTR lpValueName, //值名
__reserved DWORD Reserved, //保留填0
__in DWORD dwType, //数据类型
__in_opt const BYTE* lpData, //数据
__in DWORD cbData //数据大小
);
返回值同RegCreateKeyEx
其中数据类型参数dwType可填如下值:
4.删除值和项:
LONG WINAPI RegDeleteValue(
__in HKEY hKey,
__in_opt LPCTSTR lpValueName
);
//删除值
LONG WINAPI RegDeleteKey(
__in HKEY hKey, //句柄
__in LPCTSTR lpSubKey //项名
);
//删除键(项),注意要用该api删除的项不能有子项
如果lpSubKey指定了一个路径,hKey需要填上级项的句柄,例如lpSubKey填入SOFTWARE\\YouKu\\mytest,则hKey需要填HKEY_CURRENT_USER
如果注册表项含有子项,可用如下api删除:
LONG WINAPI RegDeleteTree(
__in HKEY hKey,
__in_opt LPCTSTR lpSubKey
);
5.修改键(项)名:
LSTATUS RegRenameKey(
HKEY hKey,
LPCWSTR lpSubKeyName,
LPCWSTR lpNewKeyName
);
6.检索注册表项的相关信息,如查看有多少个项:
LONG WINAPI RegQueryInfoKey(
__in HKEY hKey,
//以下全部是传出参数,不需要可填NULL
__out LPTSTR lpClass,
__inout_opt LPDWORD lpcClass,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpcSubKeys, //子键数
__out_opt LPDWORD lpcMaxSubKeyLen, //最长子键名长度
__out_opt LPDWORD lpcMaxClassLen,
__out_opt LPDWORD lpcValues, //值个数
__out_opt LPDWORD lpcMaxValueNameLen, //最大值名称长度
__out_opt LPDWORD lpcMaxValueLen, //值最长数据大小
__out_opt LPDWORD lpcbSecurityDescriptor,
__out_opt PFILETIME lpftLastWriteTime
);
7.遍历子键(子项):
LONG WINAPI RegEnumKeyEx(
__in HKEY hKey,
__in DWORD dwIndex, //索引
__out LPTSTR lpName,
__inout LPDWORD lpcName,
__reserved LPDWORD lpReserved,
__inout LPTSTR lpClass,
__inout_opt LPDWORD lpcClass,
__out_opt PFILETIME lpftLastWriteTime
);
8.遍历值:
LONG WINAPI RegEnumValue(
__in HKEY hKey,
__in DWORD dwIndex,
__out LPTSTR lpValueName,
__inout LPDWORD lpcchValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);
示例:
int main()
{
//创建一个新项
HKEY mykey = NULL;
LONG errcode = RegCreateKeyEx(
HKEY_CURRENT_USER,
"SOFTWARE\\YouKu\\mytest",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&mykey,
NULL
);
if (errcode == ERROR_SUCCESS)
{
cout << "succeed in creating key!"<<endl;
}
//创建指定项的值
char buff[] = "我是数据";
errcode = RegSetValueEx(
mykey,
"我是名称", //值名称
0,
REG_SZ, //数据类型
(BYTE*)buff,
sizeof(buff) //数据及其大小
);
if (errcode == ERROR_SUCCESS)
{
cout << "succeed in creating value"<<endl;
}
//删除值
errcode = RegDeleteValue(mykey, "我是名称");
if (errcode == ERROR_SUCCESS)
{
cout << "succeed in deleting value"<<endl;
}
//删除键(项)
errcode = RegDeleteKey(HKEY_CURRENT_USER,"SOFTWARE\\YouKu\\mytest");
if (errcode == ERROR_SUCCESS)
{
cout << "succeed in deleting key" << endl;
}
//遍历子键(子项)
DWORD total_key=0; //存储子键个数
HKEY hkey = NULL;
errcode = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE", 0, KEY_ALL_ACCESS, &hkey); //打开键(获取句柄)
errcode = RegQueryInfoKey(hkey,NULL,NULL,NULL,&total_key,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
for (DWORD i = 0; i < total_key; i++)
{
char keyname[MAXBYTE] = {};
DWORD len = sizeof(keyname);
RegEnumKeyEx(hkey, i, keyname, &len, NULL, NULL, NULL, NULL);
wcout << keyname << endl;
}
//遍历值
HKEY hkey2 = NULL;
errcode = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\360\\360BDoctor", 0, KEY_ALL_ACCESS, &hkey2);
cout << endl;
DWORD total_value = 0;
errcode = RegQueryInfoKey(hkey2, NULL, NULL, NULL, NULL, NULL, NULL, &total_value, NULL, NULL, NULL, NULL);
for (DWORD i = 0; i < total_value; i++)
{
//遍历值类型和名称
char valuename[MAXBYTE] = {};
DWORD valuenamelen = sizeof(valuename);
DWORD type = 0;
RegEnumValue(hkey2, i, valuename, &valuenamelen, NULL, &type, NULL, NULL);
wcout << i << "." << type << ":" << valuename << endl;
}
RegCloseKey(mykey); //关闭句柄
RegCloseKey(hkey);
RegCloseKey(hkey2);
}