Windows程序中实现程序开机自启动

         前几天要实现一个程序开机自启动的功能。很快就找了到实现这个功能的代码,主要的思路就是更改注册表的内容。

BOOL   CMainWnd::SetAutoRun()//开机自动运行  
{  
	//写入注册表,开机自启动
	HKEY hKey;

	//找到系统的启动项
	LPCTSTR lpRun="Software\\Microsoft\\Windows\\CurrentVersion\\Run";

	 DWORD dwDisposition;

	//打开启动项Key
	long lRet=RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpRun,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition);
	
	if (lRet==ERROR_SUCCESS)
	{
		char pFileName[MAX_PATH]={0};

		//得到程序自身的全路径
		DWORD dwRet=GetModuleFileName(NULL,pFileName,MAX_PATH);

		//添加一个子key,并设置值
		lRet=RegSetValueEx(hKey,"WorkAssist",0,REG_SZ,(BYTE*)pFileName,dwRet);

		//关闭注册表
		RegCloseKey(hKey);
		return TRUE;
	}
}  

      上面这个函数会将当前程序设为开机自启动。但是上面的程序执行后在注册表的“Software\\Microsoft\\Windows\\CurrentVersion\\Run”下并没有看到自己设定的“WorkAssist”项,所以自然这个程序不能实现开机自启动了。
      然后再断点调试的过程中发现RegCreateKeyEx函数的返回值不为ERROR_SUCCESS,而是为5,进入ERROR_SUCCESS的定义部分,发现ERROR_SUCCESS下面还有一个宏,其中有下面的一行宏定义:

//
// MessageId: ERROR_ACCESS_DENIED
//
// MessageText:
//
// Access is denied.
//
#define ERROR_ACCESS_DENIED              5L

          这表示RegCreateKeyEx函数返回值为5时表示权限不够,但是我在调用RegCreateKeyEx时指定的第六个参数为KEY_ALL_ACCESS,这个参数看起来像表示指定这个函数的权限为KEY_ALL_ACCESS,但是实际上好像这个更改没有效果,于是顺着这个思路,找到了问题的解决方法:

      在项目属性-配置属性-链接器-清单文件-UAC执行级别 中设为 requireAdministrator (/level=’requireAdministrator’) 以管理员身份重新运行Visual Studio后,

      更改这个编译设置后Visual Studio会重启并重新编译工程,并且在Visual Studio上面会出现“管理员身份”等字样。

      这样程序运行并会返回ERROR_SUCCESS,会修改注册表。这时如果电脑上装了360等安全软件会提示程序修改注册表的警告。点击允许程序运行就行了。

      如果操作到上面程序能正常运行就最好了,但是如果系统是64位但是visual studio选择的是32位的话可能遇到的问题就是可能出现注册表重定位的问题。就是它没有将“WorkAssist”设置到“Software\\Microsoft\\Windows\\CurrentVersion\\Run”,而是设置到了“在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\”下面。具体可以参考这篇文章





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值