windows下怎样编写开机启动的程序?

alberye 2010-08-17 10:22:41
目前已经用VS2005写了一个控制台程序,编译通过且可以通过windows的命令行运行。现在的问题是,如果需要将该程序设置为当系统开机时程序自动在后台启动的话,我该在原来程序的哪个地方添加代码?添加什么代码?自己Google了一下,知道大概需要OpenSCManager, CreateServcie等函数,但貌似没有找到一个详细说明的例子,恳请各位大虾不吝赐教,菜鸟感激万分……
...全文
1013 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyasdlh 2011-07-08
  • 打赏
  • 举报
回复
学习,学习
最近也在写这个
alberye 2010-08-18
  • 打赏
  • 举报
回复
其实我一直都不明白一点,OpenSCManager, CreateService,StartServiceCtrlDispatcher……这些函数代码是放在我要开机启动的目标程序的工程里面吗?如果是简单的添加这些代码的话系统又怎么知道我要启动这个程序呢?
菜鸟的问题都很幼稚,请大家不吝赐教
alberye 2010-08-18
  • 打赏
  • 举报
回复
请问大家,
调用函数OpenSCManager, CreateService,在main函数里注册服务StartServiceCtrlDispatcher,在ServiceMain里面调用RegisterServiceCtrlHandler注册一个Handler用于处理Service启动……
所有这些操作是如何最终实现系统开机时去启动程序的?
看了网上在这方面不少的介绍,似懂非懂的,我们编译一个exe程序,然后双击就可以运行了,但加上上面的代码后系统是怎样知道需要启动我要开机运行的程序的呢?
yzx714 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 alberye 的回复:]

引用 6 楼 yzx714 的回复:
引用 5 楼 alberye 的回复:

补充一点,如果想让程序在崩溃时自动重启运行的话,该进行怎样的操作呢??
使用另一个辅助进程,然后两个进程互相监视,如果发现另外一个进程挂了就重启。楼主在弄病毒?


当然不是,呵呵。只是工作需要,自己又不懂,所以上来请教各位……
你的意思是要同时运行两个相同的进程??
[/Quote]不用两个相同的进程,进程A的线程A执行原有任务,进程A的线程B监视进程B是否存在,进程B只用一个线程就行了,这个线程保证进程A存在。
这个手法对于Windows用户来说十分有效
e_sharp 2010-08-17
  • 打赏
  • 举报
回复
可以另外写一个监视进程,监视系统进程列表,如果目标程序进程不存在,创建新进程。
alberye 2010-08-17
  • 打赏
  • 举报
回复
谢谢临风飘雨兄,深夜继续up
kostion 2010-08-17
  • 打赏
  • 举报
回复
放到windows启动目录就可以了,还有就是注册服务
alberye 2010-08-17
  • 打赏
  • 举报
回复
关于程序在系统启动时自动重启哪一点,我知道在Linux上可以通过
if(fork())
exit(0);
setsid();
这几个函数来解决,而网上有人提到可以通过调用函数OpenSCManager, CreateServcie;
在main函数里注册服务StartServiceCtrlDispatcher,在ServiceMain里面调用RegisterServiceCtrlHandler等步骤来实现。
请问各位,有没有一些利用这种方法实现的具体的例子?或者有没有其他更好更通用的方法呢?
分有限,请各位不要见怪
alberye 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yzx714 的回复:]
引用 5 楼 alberye 的回复:

补充一点,如果想让程序在崩溃时自动重启运行的话,该进行怎样的操作呢??
使用另一个辅助进程,然后两个进程互相监视,如果发现另外一个进程挂了就重启。楼主在弄病毒?
[/Quote]

当然不是,呵呵。只是工作需要,自己又不懂,所以上来请教各位……
你的意思是要同时运行两个相同的进程??
yzx714 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alberye 的回复:]

补充一点,如果想让程序在崩溃时自动重启运行的话,该进行怎样的操作呢??
[/Quote]使用另一个辅助进程,然后两个进程互相监视,如果发现另外一个进程挂了就重启。楼主在弄病毒?
alberye 2010-08-17
  • 打赏
  • 举报
回复
补充一点,如果想让程序在崩溃时自动重启运行的话,该进行怎样的操作呢??
yzx714 2010-08-17
  • 打赏
  • 举报
回复
把自己添加到注册表中开机启动的位置,网上绝对有现成代码
alberye 2010-08-17
  • 打赏
  • 举报
回复
先谢谢松花鼠,还有其他朋友有建议的吗
ayw215 2010-08-17
  • 打赏
  • 举报
回复
要学会搜索
ayw215 2010-08-17
  • 打赏
  • 举报
回复
VC实现开机自启动
2008-12-10 14:39
很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表Software\\Microsoft\\Windows\\CurrentVersion\\Run 。
参考程序可以见下:(查找程序目录的执行文件,存在则进行添加注册表操作)
//实用代码一
int C***Dlg::CreateRun(void)
{
//添加以下代码
HKEY RegKey;
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos=sPath.ReverseFind('\\');
sPath=sPath.Left(nPos);
CString lpszFile=sPath+"\\getip.exe";//这里加上你要查找的执行文件名称
CFileFind fFind;
BOOL bSuccess;
bSuccess=fFind.FindFile(lpszFile);
fFind.Close();
if(bSuccess)
{
CString fullName;
fullName=lpszFile;
RegKey=NULL;
RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",®Key);
RegSetValueEx(RegKey,"getip",0,REG_SZ, (const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());//这里加上你需要在注册表中注册的内容
this->UpdateData(FALSE);
}
else
{
//theApp.SetMainSkin();
::AfxMessageBox("没找到执行程序,自动运行失败");
exit(0);
}
return 0;
}
//把上面的getip(共2处)替换成自己想启动程序的名字。
================================================
实用代码二:
//写入注册表,开机自启动
HKEY hKey;
//找到系统的启动项
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,并设置值 // 下面的"getip"是应用程序名字(不加后缀.exe)
lRet = RegSetValueEx(hKey, "getip", 0, REG_SZ, (BYTE *)pFileName, dwRet);
//关闭注册表
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
AfxMessageBox("系统参数错误,不能随系统启动");
}
}

一、当前用户专有的启动文件夹
这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动文件夹一般在:\Documents and Settings\<用户名字>\「开始」菜单\程序\启动,其中“<用户名字>”是当前登录 的用户帐户名称。

二、对所有用户有效的启动文件夹
这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,放入该文件夹的快捷方式总是自动启动——这是它与用户专有的启动文件夹的区别所在。 该文件夹一般在:\Documents and Settings\All Users\「开始」菜单\程序\启动。

三、Load注册键
介绍该注册键的资料不多,实际上它也能够自动启动程序。位置:HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load。

四、Userinit注册键
位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT \CurrentVersion \Winlogon\Userinit。这里也能够使系统启动时自动初始化程序。通常该注册键下面有一个 userinit.exe,如图,但这个键允许指 定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号)。

五、Explorer\Run注册键
和 load、Userinit不同,Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具 体位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion \Policies\Explorer\Run,和HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Windows \CurrentVersion\Policies\Explorer\Run。

六、RunServicesOnce注册键
RunServicesOnce 注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序。RunServicesOnce注 册键的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion \RunServicesOnce,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows \CurrentVersion\RunServicesOnce。

七、RunServices注册键
RunServices 注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。RunServices的位置 是:HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion \RunServices,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows \CurrentVersion\RunServices。

八、RunOnce\Setup注册键
RunOnce\Setup 指定了用户登录之后运行的程序,它的位置是:HKEY_CURRENT_USER\Software\Microsoft \Windows \CurrentVersion\RunOnce\Setup,和HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft \Windows\CurrentVersion\RunOnce\Setup。

九、RunOnce注册键
安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows \CurrentVersion\RunOnce和HKEY_CURRENT_USER\Software\Microsoft \Windows \CurrentVersion\RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机 在其他Run键指定的程序之前。HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动” 文件夹的内容之后运 行。如果是XP,你还需要检查一下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows \CurrentVersion\RunOnceEx。

十、Run注册键
Run 是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER\Software\Microsoft \Windows \CurrentVersion\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Windows \CurrentVersion\Run。HKEY_CURRENT_USER下面的Run键紧接 HKEY_LOCAL_MACHINE下面的Run键运 行,但两者都在处理“启动”文件夹之前。
有时候人们往往会为了一个程序的启动而头痛,因为一些用户往往不知道那些文件是如何启动的。所以经常会有些没用的东西挂在系统上占用资源。有时候也 会有人因为不知道如何启动某个文件而头痛。更有些特洛依木马的作者因为不清楚系统的自启动方式而使自己的木马轻松被别人发现……

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧