开机启动-想通过注册系统服务实现开机自启windows自带计算器

问题描述

想通过注册系统服务实现开机自启windows自带计算器

在网上找到的代码框架,自己填了最后一句,但是运行后没有实现开机自启,求修改
#include
#include
#include
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning = true;
void WINAPI ServiceMain(DWORD argc, LPTSTR argv);//服务主函数
void WINAPI ServiceCtrlHandler(DWORD Opcode);//服务控制函数
void WINAPI CmdStart(void);//要启动的程序函数
BOOL InstallService(); //安装服务的函数
BOOL DeleteService(); //删除服务的函数
int main(int argc, char
argv[])
{
printf("twindows based service demon");
printf("tgxisone@hotmail.comn");
if (argc != 3)
{
printf("usage: %s -install[remove]", argv[0]);
return 0;
}
if (strcmp(argv[1], "-install") == 0) /// install
{
if (InstallService())
printf("nnService Installed Sucessfullyn");
else
printf("nnError Installing Servicen");
}
else if (strcmp(argv[1], "-remove") == 0) // remove
{
if (DeleteService())
printf("nnService remove sucessfullyn");
else
printf("nnError removing Servicen");
}
else
{
printf("nusage: %s -install[remove]n", argv[0]);
return 0;
}
//在进入点函数里面要完成ServiceMain的初始化,
//准确点说是初始化一个SERVICE_TABLE_ENTRY结构数组,
//这个结构记录了这个服务程序里面所包含的所有服务的名称
//和服务的进入点函数
SERVICE_TABLE_ENTRY
DispatchTable[] = { { "WindowsMgr", ServiceMain }, { NULL, NULL } };
//最后的NULL指明数组的结束
StartServiceCtrlDispatcher(DispatchTable);
return 0;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR argv)
{
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler("WindowsMgr", ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)return;
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; //设置服务状态
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
//SERVICE_STATUS结构含有七个成员,它们反映服务的现行状态。
//所有这些成员必须在这个结构被传递到SetServiceStatus之前正确的设置
SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
bRunning = true;
//

CmdStart(); //启动我们的服务程序
//*
return;
}
void WINAPI ServiceCtrlHandler(DWORD Opcode)//服务控制函数
{
switch (Opcode)
{
case SERVICE_CONTROL_PAUSE: // we accept the command to pause it
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE: // we got the command to continue
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP: // we got the command to stop this service
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
bRunning = false;
break;
case SERVICE_CONTROL_INTERROGATE: //
break;
}
return;
}
BOOL InstallService() //安装服务函数
{
char strDir[1024];
SC_HANDLE schSCManager, schService;
GetCurrentDirectory(1024, strDir);
GetModuleFileName(NULL, strDir, sizeof(strDir));
char chSysPath[1024];
GetSystemDirectory(chSysPath, sizeof(chSysPath));
strcat_s(chSysPath, "");
if (!CopyFile(strDir, chSysPath, FALSE))printf("Copy file OKn"); // 把我们的服务程序复制到系统根目录
strcpy_s(strDir, chSysPath);
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
{
printf("open scmanger failed,maybe you do not have the privilage to do thisn");
return false;
}
LPCTSTR lpszBinaryPathName = strDir;

schService = CreateService(schSCManager, "WindowsMgr", "Windows Manger Control", //将服务的信息添加到SCM的数据库
    SERVICE_ALL_ACCESS, // desired access
    SERVICE_WIN32_OWN_PROCESS, // service type
    SERVICE_AUTO_START, // start type
    SERVICE_ERROR_NORMAL, // error control type
    lpszBinaryPathName, // service's binary
    NULL, // no load ordering group
    NULL, // no tag identifier
    NULL, // no dependencies
    NULL, // LocalSystem account
    NULL); // no password
if (schService == NULL)
{
    printf("faint,we failed just because we invoke createservices failedn");
    return false;
}
CloseServiceHandle(schService);
return true;

}
BOOL DeleteService()
{
SC_HANDLE schSCManager;
SC_HANDLE hService;
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
char chSysPath[1024];
GetSystemDirectory(chSysPath, sizeof(chSysPath));
strcat_s(chSysPath, "");
if (schSCManager == NULL)
{
printf("faint,open scmanger failedn");
return false;
}
hService = OpenService(schSCManager, "WindowsMgr", SERVICE_ALL_ACCESS);
if (hService == NULL)
{
printf("faint,open services failtn");
return false;
}
if (DeleteFile(chSysPath) == 0)
{
printf("Dell file Failure !n");
return false;
}
else printf("Delete file OK!n");
if (DeleteService(hService) == 0)
return false;

if (CloseServiceHandle(hService) == 0)
    return false;
else
    return true;

}
void WINAPI CmdStart(void)
{
//--------------------------------
//把你的要做成服务启动的程序代码添加到这里
//那么你的代码就可以作为NT服务启动了
//--------------------------------
system("C:WindwosSystem32calc.exe");
}

时间: 2024-08-30 23:06:06

开机启动-想通过注册系统服务实现开机自启windows自带计算器的相关文章

Win7系统如何删除开机启动项的注册表键值

  当我们遇到开机报错.文件损坏甚至是蓝屏等种种问题时,我们可以首先检查Win7系统开机自动运行的程序是否存在病毒文件以及采取相应的处理.下面小编就为大家介绍一下如何删除开机启动项的注册表键值. 1.首先,我们需要的点击开始菜单,在搜索框内输入regedit,在搜索结果中点击右键,以管理员身份运行; 2.找到下列键值: HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun HKEY_CURRENT_USERSoftwareMicro

允许开机启动-急急急,安卓获取开机启动项列表,不是AndroidManifest.xml注册的项,是手机设置的

问题描述 急急急,安卓获取开机启动项列表,不是AndroidManifest.xml注册的项,是手机设置的 急急急,安卓获取开机启动项列表,不是AndroidManifest.xml注册的项,是手机设置的,能不能获取?在网上找的资料都只有AndroidManifest.xml注册过的列表,并没有手机设置的允许开机启动的列表,求大神支招...如图所示的开机启动列表! 解决方案 各位大神,大牛们,帮帮忙吧

Linux开机启动chkconfig 让MySQL、Apache开机启动

chkconfig chkconfig在命令行操作时会经常用到.它可以方便地设置和查询不同运行级上的系统服务.这个可要好好掌握,用熟练之后,就可以轻轻松松的管理好你的启动服务了. 注:谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 语法: chkconfig       [--add]      [--del]     [--list]      [系统服务] chkconfig       [--level/levels]      [等级代号]     

centos7 开机启动慢-centos7更新系统后开机启动变慢,怎么办?

问题描述 centos7更新系统后开机启动变慢,怎么办? 我用的Centos7的系统,自从有次不小心点了更新系统后,发现开机慢了好多,要几十秒 钟才出现登陆界面,有同学遇到相同的问题吗?

Windows7开机启动程序怎么设置?win7开机启动程序设置

方法一.利用msconfig命令来设置 第一步.在桌面我们点击"开始---运行"或按" win+R 键"打开运行框,如下.     第二步.输入msconfig"命令,然后点击确认.     第三步.在打开系统配置框中我们,切换到"启动"如图所示.     好了在此面就可以设置要启动或关闭不启动的程序了,然后重启计算机即可.     方法二,利用电脑管家了,如我们这里以360安全卫士 在打开的360里面会有一个"优化加速&qu

电脑开机启动项怎么设置?

  方法一:最简单最原始的方法,使用开机启动命令 在 开始--运行--输入:msconfig 命令,进入如下系统配置界面: 系统配置界面 启动项中除了杀毒软件和输入法(cftmon不可关闭否则你就不会在任务栏看语言栏了)外,其它的都可以关闭或者使用者可以根据自己的需要自由地选择取舍. 其实关闭并不是删除,只是开机时不运行罢了.你若想运行可以从程序菜单中打开. 不同电脑可能安装的程序不一样,所以所看到的程序或许不一一样,以下总结了一些系统常见启动项. ctfmon.exe----是Microsof

Win7设置开机启动项命令的方法

  我们都知道电脑刚装完Win7的系统,开机速度很快,但使用一段时间后会发现开机启动越来越慢.导致开机启动越来越慢的原因有很多,比如:电脑使用久了,不知不觉启动的项目就多了,系统垃圾也多了.那Win7开机启动项怎么设置?下面就和大家说一下Win7开机启动项怎么设置,设置开机启动项命令的方法. 具体步骤如下: 1.在"开始"-"运行"对话框中输入"Msconfig"就打开"系统配置实用程序". 2.Msconfig是Window

开机启动项怎么设置?

  开机启动项设置包括两个方面.一是如何禁用开机启动.二则是软件如何开启开机启动.一般开机启动项不需要太多所以需要进行管理.而有的程序需要开机启动的话则可以进行一些设置. 方法/步骤 首先说的是如何让程序开机启动.第一类软件是自己具有开机自动启动设置的程序.以qq举例在设置中.选择常规设置,设置开机自动启动即可了.很多同类型软件都可以用这种方法实现. 如果程序本身没有设置的支持那么又该如何处理呢.首先打开开始菜单,然后选择启动,这时候在启动位置右键选择打开 这时候复制你想要开启启动程序的快捷方式

如何在 Ubuntu 中管理开机启动应用

在 Ubuntu 中管理开机启动应用 你曾经考虑过 在 Ubuntu 中管理开机启动应用 吗?如果在开机时,你的 Ubuntu 系统启动得非常缓慢,那么你就需要考虑这个问题了. 每当你开机进入一个操作系统,一系列的应用将会自动启动.这些应用被称为'开机启动应用' 或'开机启动程序'.随着时间的推移,当你在系统中安装了足够多的应用时,你将发现有太多的'开机启动应用'在开机时自动地启动了,它们吃掉了很多的系统资源,并将你的系统拖慢.这可能会让你感觉卡顿,我想这种情况并不是你想要的. 让 Ubuntu