首先,注册表中的数据是通过一种树状结构以根键和子键的形式组成的。放在这些键中的各种参数控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行。
自己分别在Windows 7、vista和xp系统中打开注册表编辑器,发现都有五个根键,分别是:HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS和HKEY_CURRENT_CONFIG。上网查了一下,发现Windows 98还有一个记录系统运行时刻状态的HKEY_DYN_DATA总共六个根键。这五个根键存放的信息分别是:
HKEY_CLASSES_ROOT根键:记录了某类文件和打开该类文件的应用程序之间的相互关联关系。
HKEY_CURRENT_USER根键:包含了当前登录用户的配置文件信息。
HKEY_LOCAL_MACHINE根键:包含了当前计算机的配置数据,包括所安装的硬件以及软件的设置。这些性新为所有的用户登录系统服务。
HKEY_USERS根键:包括默认用户的信息和所有以前登录用户的信息。
HKEY_CURRENT_CONFIG根键:包含有关本地计算机在系统启动时使用的硬件配置文件的信息。
其中,HKEY_LOCAL_MACHINE一个键已经存放了HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG中存放的信息,HKEY_USERS也存放着HKEY_CURRENT_USER中存放的信息。
一个根键键就是一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。
键的数据类型主要有以下四种:
REG_SZ:字符串。文本字符串。
REG_MULTI_SZ:多字符串。含有多个文本值的字符串。
REG_BINARY:二进制数。二进制值,以十六进制显示。
REG_DWORD:双字。一个32位的二进制值,显示为8位的十六进制值。
OK,有了注册表的基本概念后,可以动手来编程实现修改IE首页了。关于注册表的API函数有二三十个,提供对注册表的读取,写入,删除,以及打开注册表及键值等操作。修改IE首页主要涉及打开键、设置键值和关闭键三个操作,相关的API分别是:
LONG RegCreateKeyEx(
HKEY hKey,
LPCWSTR lpSubKey,
DWORD Reserved,
LPWSTR lpClass,
DWORD dwOptions,
REGSAM samDesired,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition
);
本函数打开指定的键或子键。如果要打开的键不存在的话,则建立它。第一个参数是根键;第二个参数是子键;第三个参数设为0;第四个参数设为NULL;第五个参数为注册表键选项,可以设置为REG_OPTION_NON_VOLATILE或REG_OPTION_VOLATILE;第六个参数设置为0;第七个参数设置为NULL;第八个参数为一个句柄指针,该句柄用RegCloseKey关闭。该函数调用不成功返回非0,成功返回ERROR_SUCCESS。
LONG RegSetValueEx( HKEY hKey, LPCWSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE* lpData, DWORD cbData );
本函数设置某子键下特定名称的值。第一个参数为RegCreateKeyEx中第八个参数所指的句柄,第二个参数为名称;第三个参数设为0;第四个函数是键的类型;第五个函数是指向键值的指针;第六个参数是该键值的大小。函数调用不成功返回非0,成功返回ERROR_SUCCESS。
LONG RegCloseKey( HKEY hKey );
本函数关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果。关闭一个键后,句柄变为非法,以使其不可再次被使用。为系统重新使用而释放句柄。函数调用不成功返回非0,成功返回ERROR_SUCCESS。
修改IE首页的代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
HKEY hkey;
LPCTSTR path = _T("Software\\Microsoft\\Internet Explorer\\Main");
//打开键,若没有则创建
LONG ret = RegCreateKeyEx(HKEY_CURRENT_USER ,path,0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS ,NULL,&hkey,NULL);
if(ret != ERROR_SUCCESS)
{
printf("Error ! RegCreateKeyEx() failed!\n");
return -1;
}
LPCTSTR startPage = _T("g.cn");
//修改键值
ret = RegSetValueEx(hkey,_T("Start Page"),NULL,REG_SZ,(BYTE*)startPage,_tcslen(startPage)*2);
if(ret != ERROR_SUCCESS)
{
printf("Error ! RegSetValueEx() failed!\n");
return -1;
}
//关闭该键
RegCloseKey(hkey);
return 0;
}