C++开发中实现程序自动启动的操作方法

来源:爱站网时间:2021-01-04编辑:网友分享
当我们在windows中编写自己的程序时,我们也可以使自己的程序在计算机打开时自动运行,计算机开机时自动启动的所有程序的一些信息都放在注册表的一个文件夹中,下面是爱站技术频道小编和大家分享的C++开发中实现程序自动启动的操作方法,一起参考看看吧!

当我们在windows中编写自己的程序时,我们也可以使自己的程序在计算机打开时自动运行,计算机开机时自动启动的所有程序的一些信息都放在注册表的一个文件夹中,下面是爱站技术频道小编和大家分享的C++开发中实现程序自动启动的操作方法,一起参考看看吧!

关于注册表 我们可以在键盘上同时按下 win+r 键,在运行串口中输regedit 回车即可看到注册表(可以理解为一个大树,记录着系统中的信息),我们点击左边文件夹,点击顺序为:Software\\Microsoft\\Windows\\CurrentVersion\\Run,在这个文件夹中存放的便是随机启动的 程序的信息。举个例子:当我们使用某个电脑优化软件进行电脑优化时,他会检测到需要开机优化的项目,即有些软件不必要开机就启动,修改的就是这个文件中的一些信息。

首先我们解释下所用到的函数的含义:

RegOpenKeyEx()

函数功能描述:打开一个指定的注册表键
原型

LONG RegOpenKeyEx(
HKEY hKey, // 需要打开的主键的名称
LPCTSTR lpSubKey, //需要打开的子键的名称
DWORD ulOptions, // 保留,设为0
REGSAM samDesired, // 安全访问标记,也就是权限
PHKEY phkResult // 得到的将要打开键的句柄
)
Parameters
参数:
hKey
入参,标识当前被 RegCreateKeyEx 或RegOpenKeyEx打开的注册表键的句柄,或者是以下预定义的句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS


lpSubKey
入参,该参数指向一个字符串,该字符串用来保存将要打开的注册表名称。如果这个参数是空,或者是一个指向空串的指针,该函数将会打开一个由hKey所定义的键,在此种情况下,该函数不会关闭舷墙已经打开的句柄。

ulOptions
入参,保留,设置为0

samDesired
入参。标识打开注册表的权力,如果该参数的安全描述符不容许当前进程访问注册表,则该函数会返回失败。此程序中我们使用写入参数即:KEY_WRITE (0x20006)。

phkResult
出参,指向一个变量的指针,该变量用来保存打开注册表键的句柄。如果不再使用返回的句柄,则调用RegCloseKey来关闭它。

返回值:
ERROR_SUCCESS表示该函数执行成功,非零值表示该函数执行失败。想要获得错误描述,调用FormatMessage函数,并传入FORMAT_MESSAGE_FROM_SYSTEM参数。

二:
GetModuleFileName(NULL,pFileName, MAX_PATH);
函数原型获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。)

DWORDGetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);
HMODULE hModule: 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序的全路径。
lpFileName: 是你存放返回的名字的内存块的指针,是一个输出参数。
DWORD nSize:装载到缓冲区lpFileName的最大值。

注意:如果想获得某个正在运行的EXE或者DLL的全路径可以这样写代码
GetModuleFileNameEx(hProcess,hInst,lpFile,MAX_PATH);//注意下缓冲区就行了。

三:

RegSetValueEx():想要设置的注册表项下不是默认值,即有名称值的数据和类型时,可以调用RegSetValueEx函数,该函数将在注册表项下设置指定值的数据和类型。

LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
hKey: 一个已打开项的句柄
lpValueName:指向一个字符串的指针,该字符串包含了欲设置值的名称。若拥有该值名称的值并不存在于指定的注册表项中,则此函数将其加入到该项。
Reserved:保留值,必须强制为0
dwType: 指定将被存储的数据类型
lpData: 指向一个缓冲区,该缓冲区包含了欲为指定值名称存储的数据。
cbData:指定由lpData参数所指向的数据的大小,单位是字节。

以下代码时实现让本程序开机自启的方法.
我们建立个对话框程序,在对话框上放一个button,然后在其消息响应函数中写如下代码:

void CSetAutoRunDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
	HKEY hKey;  //可以理解为操作注册表的句柄
  
	//找到系统的启动项  ,长指针类型是const char * 类型
  LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";  
  
  //打开启动项Key  
  long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);  
  
	if(lRet == ERROR_SUCCESS)  //打开成功
  {  
    char pFileName[MAX_PATH] = {0};  //定义数组存放路径
    //得到程序自身的全路径  
    DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);  
    //添加一个子Key,并设置值 // 下面的"test"是应用程序名字(不加后缀.exe) 
    lRet = RegSetValueEx(hKey, "SetAutoRun", 0, REG_SZ, (BYTE *)pFileName, dwRet);  
    //关闭注册表  
    RegCloseKey(hKey);  
    if(lRet != ERROR_SUCCESS)  
    {  
      MessageBox("系统参数错误,不能完成开机启动设置");  
    }  
    else 
    { 
      MessageBox("打开开机启动成功");  
    } 
    // isrun = 1; 
  }  
}

点击运行后,出现"启动成功"对话框,重启电脑后,软件开机启动(当运行程序时,有的杀毒软件可能会发出注册表修改的警告,那正是我们的程序在修改注册表)

上文是爱站技术频道小编带给大家的C++开发中实现程序自动启动的操作方法,大家了解的如何了呢?搜索js.aizhan.com为你带来更多的知识。

上一篇:C语言开发中文件内容的随机排列算法

下一篇:C++操作中强制类型转换的方法

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载