C++ (MFC) 编写注册表,使开机自启动

来源:互联网 发布:普吉岛海滩哪个好 知乎 编辑:程序博客网 时间:2024/06/05 06:07

注册表的编写

设置一个按钮来调用注册表的函数;

void CMFCtest1Dlg::OnBnClickedButton5(){    // TODO: 在此添加控件通知处理程序代码    Autostart();//注册表函数;}

这里编写注册表自启动函数

BOOL CMFCtest1Dlg::Autostart(){    TCHAR pathstr[MAX_PATH] = { 0 };//max_path代表最大目录值,等于260;    GetModuleFileName(NULL, pathstr, MAX_PATH);//获取进程的目录,当第一个参数为null时,使用当前进程目录;    HKEY hsoftkey;    RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), &hsoftkey);    /*    返回值    Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码    参数表    参数 类型及说明    hKey Long,一个已打开项的句柄,或指定一个标准项名    lpSubKey String,要打开的项名    phkResult Long,指定一个变量,用于装载(保存)打开注册表项的一个句柄    */    int len = _tcslen(pathstr);    RegSetKeyValue(hsoftkey, 0, _T("autostart"), REG_SZ, pathstr, len);    BYTE content[MAX_PATH] = { 0 };    DWORD ret = 0;    DWORD dwType = REG_SZ;    DWORD type2 = 0;    DWORD size;    //需要调用两遍,第一次调用获取储存值,第二次赋值,如果只调用一次会出现容量不足的error;    ret = RegGetValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), _T("autostart"), RRF_RT_REG_SZ, &type2, NULL, &size);    ret = RegGetValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), _T("autostart"), RRF_RT_REG_SZ, &type2, content, &size);    RegCloseKey(hsoftkey);    return 0;}

如果文档写好后运行时出现杀毒软件提醒(如下图),选择允许本次操作,毕竟注册表是敏感的东西,杀毒软件都会提醒
这里写图片描述

其中有些函数方法不太懂,查了一下官方的文档

LONG WINAPI RegGetValue(
In HKEY hkey,
In_opt LPCTSTR lpSubKey,
In_opt LPCTSTR lpValue,
In_opt DWORD dwFlags,
Out_opt LPDWORD pdwType,
Out_opt PVOID pvData,
Inout_opt LPDWORD pcbData
);

  • hkey [in]
    一个打开注册表项的句柄

  • lpSubKey [in,可选]
    注册表项的名称。也就是注册表文件当前所在目录

  • lpValue [in,可选]
    注册表值的名称。
    如果此参数为NULL或空字符串“”,则该函数将检索该密钥的未命名或默认值(如果有)的类型和数据

  • dwFlags [in,可选]
    限制要查询的值的数据类型的标志。如果该值的数据类型不符合该标准,则该功能失败。该参数可以是以下一个或多个值。
    值和含义
    RRF_RT_ANY
    0x0000ffff
    没有类型限制。
    RRF_RT_DWORD
    0x00000018
    将类型限制为32位RRF_RT_REG_BINARY | RRF_RT_REG_DWORD。
    RRF_RT_QWORD
    0x00000048
    将类型限制为64位RRF_RT_REG_BINARY | RRF_RT_REG_DWORD。
    RRF_RT_REG_BINARY
    0x00000008
    将类型限制为REG_BINARY。
    RRF_RT_REG_DWORD
    0x00000010
    将类型限制为REG_DWORD。
    RRF_RT_REG_EXPAND_SZ
    0x00000004
    将类型限制为REG_EXPAND_SZ。
    RRF_RT_REG_MULTI_SZ
    0x00000020
    将类型限制为REG_MULTI_SZ。
    RRF_RT_REG_NONE
    00000001
    将类型限制为REG_NONE。
    RRF_RT_REG_QWORD
    0x00000040
    将类型限制为REG_QWORD。
    RRF_RT_REG_SZ
    0x00000002
    将类型限制为REG_SZ。
    RRF_NOEXPAND
    0x10000000处
    如果值是REG_EXPAND_SZ类型,则不要自动展开环境字符串。
    RRF_ZEROONFAILURE
    0x20000000
    如果pvData不是NULL,则在失败时将缓冲区的内容设置为零。
    RRF_SUBKEY_WOW6464KEY
    0x00010000在
    如果lpSubKey不为NULL,请使用KEY_WOW64_64KEY访问权限打开lpSubKey指定的子项 。有关这些访问权限的信息,请参阅注册表项安全和访问权限。
    您无法将RRF_SUBKEY_WOW6464KEY与RRF_SUBKEY_WOW6432KEY结合使用 。
    RRF_SUBKEY_WOW6432KEY
    0x00020000
    如果lpSubKey不为NULL,请使用KEY_WOW64_32KEY访问权限打开lpSubKey指定的子项 。有关这些访问权限的信息,请参阅注册表项安全和访问权限。
    您不能将RRF_SUBKEY_WOW6432KEY与RRF_SUBKEY_WOW6464KEY一起 指定。

  • pdwType [out,可选]
    指向一个变量的指针,该变量接收指示存储在指定值中的数据类型的代码。有关可能的类型代码的列表,请参阅 注册表值类型。如果类型不是必需的,这个参数可以是NULL。

  • pvData [out,可选]
    指向接收值的数据的缓冲区的指针。如果数据不是必需的,这个参数可以是NULL。
    如果数据是字符串,则函数检查终止的空字符。如果没有找到,如果缓冲区足够大,以容纳额外的字符,字符串存储与空终止符。否则,该函数将失败并返回ERROR_MORE_DATA。

  • pcbData [输入,输出,可选]
    指向变量的指针,指定由pvData参数指向的缓冲区的大小(以字节为单位)。当函数返回时,这个变量包含复制到pvData的数据的大小。

ps:参考官方文档地址
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724868(v=vs.85).aspx

LONG WINAPI RegSetKeyValue(
In HKEY hKey,
In_opt LPCTSTR lpSubKey,
In_opt LPCTSTR lpValueName,
In DWORD dwType,
In_opt LPCVOID lpData,
In DWORD cbData
);
参数

  • hKey [输入]
    一个打开注册表项的句柄。密钥必须已经用KEY_SET_VALUE访问权限打开。

  • lpSubKey [in,可选]
    密钥的名称和由hKey标识的密钥的子密钥。如果此参数为NULL,则使用hKey值在该密钥中创建此值,并且该密钥获取默认的安全描述符。

  • lpValueName [in,可选]
    数据将被更新的注册表值的名称。

  • dwType [in]
    由lpData参数指向的数据的类型。有关可能的类型的列表,请参阅 注册表值类型。

  • lpData [in,可选]
    要用指定的值名称存储的数据。
    对于基于字符串的类型(如REG_SZ),该字符串必须以空字符结尾。使用REG_MULTI_SZ数据类型时,字符串必须以两个空字符结尾。

  • cbData [in]
    lpData参数指向的信息的大小,以字节为单位。如果数据类型为REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,则cbData必须包含终止空字符的大小。

ps:参考官方文档地址
https://msdn.microsoft.com/en-us/library/ms724921(VS.85).aspx

原创粉丝点击