zoukankan      html  css  js  c++  java
  • windows 注册表操作

    注册表概述

    概述

    注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等.

    数据结构

    注册表由键(或称"项")、子键(子项)和值项构成.一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键.一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成.一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值.

    数据类型

    注册表的数据类型主要有以下四种:
    显示类型(在编辑器中)   数据类型    说明                   
    REG_SZ          字符串     文本字符串
    REG_MULTI_SZ       多字符串    含有多个文本值的字符串
    REG_BINARY         二进制数    二进制值,以十六进制显示.
    REG_DWORD        双字      一个32位的二进制值,显示为8位的十六进制值.

    各主键的简单介绍

    • HKEY_LOCAL_MACHINE  是一个显示控制系统和软件的处理键.HKLM键保存着计算机的系统信息.它包括网络和硬件上所有的软件设置.
    • HKEY_CLASSES_ROOT  是系统中控制所有数据文件的项.
    • HKEY_USERS  将缺省用户和目前登陆用户的信息输入到注册表编辑器
    • HKEY_CURRENT_USER  包含着在HKEY_USERS安全辨别里列出的同样信息
    • HKEY_CURRENT_CONFIG  包括了系统中现有的所有配置文件的细节.HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息. HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化.

    相关函数

    显示相关函数

    [创建键][打开键][删除键][添加/修改键值][删除键值][读取键值]
    创建键 RegCreateKeyEx
    函数原型

    LONG RegCreateKeyEx(
    HKEY hKey, // handle to open key
    LPCTSTR lpSubKey, // subkey name
    DWORD Reserved, // reserved
    LPTSTR lpClass, // class string
    DWORD dwOptions, // special options
    REGSAM samDesired, // desired security access
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
    PHKEY phkResult, // key handle
    LPDWORD lpdwDisposition // disposition value buffer
    );

    参数说明

    hKey:   要打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpSubKey:   指向一个用于定义子键路径的字符串
    Reserved,dwOptions,samDesired:   置0
    lpClass,lpSecurityAttributes:   置NULL
    phkResult:   用于接收键句柄
    lpdwDisposition:   接收的相关信息,取值如下

    REG_CREATED_NEW_KEY   创建成功
    REG_OPENED_EXISTING_KEY    键已存在

    打开键 RegOpenKeyEx
    函数原型

    LONG RegOpenKeyEx(
    HKEY hKey, // handle to open key
    LPCTSTR lpSubKey, // subkey name
    DWORD ulOptions, // reserved
    REGSAM samDesired, // security access mask
    PHKEY phkResult // handle to open key
    );

    参数说明

    hKey:     要打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpSubKey:   指向一个用于定义子键路径的字符串
    ulOptions:   保留位,置0
    samDesired:   打开键后键的操作权限
    phResult:   接收打开的键的句柄

    删除键 RegDeleteKey
    函数原型

    LONG RegDeleteKey(
    HKEY hKey, // handle to open key
    LPCTSTR lpSubKey // subkey name
    );

    参数说明

    hKey:   要打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpSubKey:   指向一个用于定义子键路径的字符串

    修改/添加键值 RegSetValueEx
    函数原型

    LONG RegSetValueEx(
    HKEY hKey, // handle to key
    LPCTSTR lpValueName, // value name
    DWORD Reserved, // reserved
    DWORD dwType, // value type
    CONST BYTE *lpData, // value data
    DWORD cbData // size of value data
    );

    参数说明

    hKey:   打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpValueName:   键值的名称
    Reserved:   保留位,置0
    dwType:   键值的类型
    lpData:   键值
    cbData:   键值数据长度

    删除键值 RegDeleteValue
    函数原型

    LONG RegDeleteValue(
    HKEY hKey, // handle to key
    LPCTSTR lpValueName // value name
    );

    参数说明

    hKey:   打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpValueName:   键值的名称

    读取键值 RegQueryValueEx
    函数原型

    LONG RegQueryValueEx(
    HKEY hKey, // handle to key
    LPCTSTR lpValueName, // value name
    LPDWORD lpReserved, // reserved
    LPDWORD lpType, // type buffer
    LPBYTE lpData, // data buffer
    LPDWORD lpcbData // size of data buffer
    );

    参数说明

    hKey:   打开键的句柄或以下预定义句柄

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS


    lpValueName:   键值的名称
    Reserved:   保留位,置0
    lpType:   接收键值的类型
    lpData:   接收键值
    lpcbData:   接收键值数据长度


    注册表编程(利用注册表写开机启动程序)

    执行流程

    代码样例

    运行结果:

    删除键

    修改/创建键值

    运行结果:

    读取键值

    运行结果(读取"test"键值):

    删除键值

    运行结果:

    程序源码

    #include <windows.h>
    #include <iostream>
    #include <cstdlib>
    using namespace std;

    void main()
    {
    HKEY hKey;
    LPCTSTR lpRun = "Software\_MyTest";
    DWORD state,dwtype,sizeBuff;
    long lRet;
    char reBuff[10] = {0};


    /*创建键***************************************************************************/
    ////创建键
    //lRet = RegCreateKeyEx(HKEY_CURRENT_USER,lpRun,0,NULL,0,0,NULL,&hKey,&state);
    //if(lRet == ERROR_SUCCESS)
    //{
    // if(state == REG_CREATED_NEW_KEY)
    // cout<<"表项创建成功"<<endl;
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*打开/修改键值********************************************************************/
    ////打开键
    //lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
    //if(lRet == ERROR_SUCCESS)
    //{
    // //创建或者修改键值
    // RegSetValueEx(hKey, "test",0,REG_SZ,(BYTE *)"success",10);
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*读取键值*************************************************************************/
    ////打开键
    //lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_READ, &hKey);
    //if(lRet == ERROR_SUCCESS)
    //{
    // sizeBuff = sizeof(reBuff);
    //
    // //读取键值
    // if(RegQueryValueEx(hKey,"test",0,&dwtype,(BYTE*)reBuff,&sizeBuff) == ERROR_SUCCESS)
    // cout<<reBuff<<endl;
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*删除键值************************************************************************/
    ////打开键
    //lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
    //if(lRet==ERROR_SUCCESS)
    //{
    // //删除键
    // RegDeleteValue(hKey,"test");
    //
    // //关闭键
    // RegCloseKey(hKey);
    //}


    /*删除键**************************************************************************/
    RegDeleteKey(HKEY_CURRENT_USER,lpRun);

    system("pause");
    }

    利用注册表写开机启动程序

    说明:

    通过向注册表 HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun 中添加键值来让程序在开机时被系统加载.

    步骤:

    • 设置开机启动
        
    • 取消开机启动
        

    程序源码:

    //这里用的是宽字符,既 wchar_t

    if(isStartOpen)
    {
    //开机启动
    HKEY hKey;
    LPCTSTR lpRun = L"Software\Microsoft\Windows\CurrentVersion\Run";
    //---------------找到系统的启动项
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    //-----------打开启动项Key
    if(lRet == ERROR_SUCCESS)
    {
    wchar_t pFileName[MAX_PATH] = {0};
    DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
    //----------------得到程序自身的全路径
    lRet = RegSetValueEx(hKey, L"DeskPro",0,REG_SZ,(BYTE *)pFileName,dwRet*2);
    //----------------添加或者修改注册表项
    RegCloseKey(hKey);
    //----------------关闭注册表
    }
    }
    else
    {
    //取消卡机启动
    HKEY hKey;
    LPCTSTR lpRun = L"Software\Microsoft\Windows\CurrentVersion\Run";
    //---------------找到系统的启动项
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    if(lRet==ERROR_SUCCESS)
    {
    RegDeleteValue(hKey,L"DeskPro");
    //----------------删除注册表项
    RegCloseKey(hKey);
    //----------------关闭注册表
    }
    }

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/xiaogui9527/p/3280905.html
Copyright © 2011-2022 走看看