• 【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 于南昌


  • 相关阅读:
    μTorrent for Windows
    坚决抵制Rarbg的恶意修改版
    Check YouTube Video Restrictions Online
    Questions about "Computer Systems: A Programmer's Perspective"
    los diccionarios que te acercan al mundo
    sqlserver 备份数据库 按时间命名备份文件
    Linux中的硬链接和软链接的概念、区别及用法
    高恪固件端口映射怎么配置
    C++中的DLL,Delphi调用需要注意之一
    Delphi中主线程与子线程调用同一方法同步问题
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211411.html
Copyright © 2020-2023  润新知