Windows程序中实现程序开机自启动
2013-11-30 18:01
387 查看
前几天要实现一个程序开机自启动的功能。很快就找了到实现这个功能的代码,主要的思路就是更改注册表的内容。
上面这个函数会将当前程序设为开机自启动。但是上面的程序执行后在注册表的“Software\\Microsoft\\Windows\\CurrentVersion\\Run”下并没有看到自己设定的“WorkAssist”项,所以自然这个程序不能实现开机自启动了。
然后再断点调试的过程中发现RegCreateKeyEx函数的返回值不为ERROR_SUCCESS,而是为5,进入ERROR_SUCCESS的定义部分,发现ERROR_SUCCESS下面还有一个宏,其中有下面的一行宏定义:
这表示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\”下面。具体可以参考这篇文章。
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\”下面。具体可以参考这篇文章。
相关文章推荐
- VC实现程序开机自启动
- 修改注册表 实现开机程序自启动
- qt for android实现程序的开机自启动。
- 如何实现symbian程序开机自启动(合辑)
- android实现程序开机自启动
- 如何将程序添加到系统服务实现开机自启动
- centos下实现程序开机自启动(tomcat为例)
- C++实现程序开机自启动
- exe程序有几种方式实现开机自启动
- Android 开机自启动程序的实现
- C++实现程序开机自启动
- 实现linux 程序开机自启动
- Debian/Ubuntu Linux实现开机自启动程序
- C#中实现程序开机自启动 三种方式
- 如何将程序添加到系统服务实现开机自启动
- Android程序开机自启动的实现方式
- C++操作注册表实现开机自启动程序
- symbian 利用Recognizer编写自己的MDL实现开机自启动程序
- C#中实现程序开机自启动
- CentOS下实现程序开机自启动