【VC++积累】之三、操作注册表

注册表是我们操作系统的一个数据库,它的结构同逻辑磁盘类似。 相信大家都用过了。  他有键,值!


上图就是我们计算机中的注册表!


现在我们来看API函数

1、打开关闭注册表

LONG WINAPI RegCreateKeyEx(
  _In_        HKEY hKey,       //指定父键的句柄
  _In_        LPCTSTR lpSubKey,   //要打开的子键名称,这个子键必须是hKey参数指定的子键
  _Reserved_  DWORD Reserved,    //保留,必须为0
  _In_opt_    LPTSTR lpClass,   //定义一个类名,一般为0
  _In_        DWORD dwOptions,   //创建子键的时候的选项
  _In_        REGSAM samDesired,   //指定子键的打开方式
  _In_opt_    LPSECURITY_ATTRIBUTES lpSecurityAttributes,     //指定子键句柄的继承性
  _Out_       PHKEY phkResult,         //指向一个双字变量,用于返回创建或者打开的子键的句柄
  _Out_opt_   LPDWORD lpdwDisposition   //作为输入时指定子键不存在时,是否要创建子键,作为输出时返回值指定到底是创建了新建还是打开了存在的键,可以设为NULL
);


LONG WINAPI RegCloseKey(
  _In_  HKEY hKey   //指定父键的句柄
);

2、删除子键


LONG WINAPI RegDeleteKey(
  _In_  HKEY hKey,   //要删除的键的父键句柄
  _In_  LPCTSTR lpSubKey   //要删除的子键的名称
);

3、操作键值

LONG WINAPI RegSetValueEx(
  _In_        HKEY hKey,  //键值所在子键的子键句柄
  _In_opt_    LPCTSTR lpValueName,   //要设置的键值名称
  _Reserved_  DWORD Reserved,   //保留,必须为0
  _In_        DWORD dwType,  //要设置的键值的数据类型
  _In_        const BYTE *lpData,  //指向包含键值数据的缓冲区
  _In_        DWORD cbData   //lpData参数指向的缓冲区的长度
);

读取键值数据类型和数据内容

LONG WINAPI RegQueryValueEx(
  _In_         HKEY hKey,  //键值所在子键的子键句柄
  _In_opt_     LPCTSTR lpValueName,  //键值名称
  _Reserved_   LPDWORD lpReserved,  //保留,必须为0
  _Out_opt_    LPDWORD lpType,   //返回键值的数据类型 
  _Out_opt_    LPBYTE lpData,  //返回键值的数据内容
  _Inout_opt_  LPDWORD lpcbData  //指定lpData参数指向的缓冲区的长度
);

删除键值函数

LONG WINAPI RegDeleteValue(
  _In_      HKEY hKey,   //键值所在的子键的子键句柄
  _In_opt_  LPCTSTR lpValueName   //要删除的键值的名称
);




写注册表之前,你必须先将目标子键打开,取得这个键对应的handle才可以!

BOOL SetRegValues(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, DWORD dwBuf)
{
	UpdateData(TRUE);//更新

	HKEY hkey;
        //打开或者创建子键
	LONG hk = ::RegCreateKeyEx(hKey, lpSubKey, 0, NULL, 
		REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
		&hkey, NULL);
	if(hk != ERROR_SUCCESS)//打开或者创建失败
	{
		MessageBox("很遗憾,创建/打开注册表失败~~~~~~~~~~~", "---");
		return FALSE;
	}else//打开或者创建成功
	{
                //设置键值的内容
		LONG regs = RegSetValueEx(hkey, lpValueName, 0, REG_DWORD, (BYTE*)&dwBuf, sizeof(dwBuf)); 
		if(regs != ERROR_SUCCESS)//设置失败
		{
			MessageBox("很遗憾,注册表值修改失败~~~~~~~~    ","---");
			return FALSE;
		}
	}
        //执行一个操作!  这里是cmd   更新一下!
	ShellExecute(NULL, "open", "CMD.EXE/C gpupdate", NULL, NULL, SW_HIDE);
	Sleep(1000);
        //关闭注册表
	RegCloseKey(hkey);
	return TRUE;
}

上面的这段代码在写程序的时候可以直接用,封装函数!


2012/8/19

jofranks 于南昌


原文地址:https://www.cnblogs.com/java20130723/p/3211411.html