您的位置:首页 > 其它

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

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

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\”下面。具体可以参考这篇文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: