如何把一个程序注册成系统服务呢?

apcad 2005-02-21 06:34:00
在c++中,我现在想把一个程序(比如:写磁盘)的程序作成一个系统服务,该如何实现呢?请给出相关资料和信息,不胜感激!
...全文
413 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
master_ttch 2005-02-22
  • 打赏
  • 举报
回复
学习
legendhui 2005-02-22
  • 打赏
  • 举报
回复
学习
Practise_Think 2005-02-21
  • 打赏
  • 举报
回复
不错先MARK一下
EnochShen 2005-02-21
  • 打赏
  • 举报
回复
//要做成服务的EXE必须这样写

#include <stdio.h>
#include <windows.h>
#include <winsvc.h>

#define SERVERNAME "EnochServer"

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceControl(DWORD nControlCode);
BOOL ExecuteService();
void TerminateService();
DWORD WINAPI ServiceProc(LPVOID lpParameter);
BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint);

SERVICE_STATUS_HANDLE hServiceStatus;
DWORD ServiceCurrentStatus;
HANDLE hServiceThread;
BOOL bServiceRunning;
HANDLE hServiceEvent;

void main(int argc, char* argv[])
{
SERVICE_TABLE_ENTRY ServiceTable[] =
{
{SERVERNAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL}
};

if(!StartServiceCtrlDispatcher(ServiceTable))
{
printf("RegisterServer First");
}
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
hServiceStatus = RegisterServiceCtrlHandler(SERVERNAME,(LPHANDLER_FUNCTION)ServiceControl);
if(!hServiceStatus || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000))
{
return;
}

hServiceEvent = CreateEvent(0,TRUE,FALSE,0);
if(!hServiceEvent || !UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000))
{
return;
}

if(!ExecuteService())
{
return;
}

ServiceCurrentStatus = SERVICE_RUNNING;

if(!UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0))
{
return;
}

WaitForSingleObject(hServiceEvent,INFINITE);
CloseHandle(hServiceEvent);
}

void WINAPI ServiceControl(DWORD dwControlCode)
{
switch(dwControlCode)
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
ServiceCurrentStatus = SERVICE_STOP_PENDING;
UpdateServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,0,1,3000);
TerminateService();
return;
default:
break;
}

UpdateServiceStatus(ServiceCurrentStatus,NO_ERROR,0,0,0);
}

BOOL ExecuteService()
{
DWORD dwThreadID;
hServiceThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceProc,0,0,&dwThreadID);

if(hServiceThread != NULL)
{
bServiceRunning = TRUE;
return TRUE;
}
else
{
return FALSE;
}
}

void TerminateService()
{
bServiceRunning = FALSE;
SetEvent(hServiceEvent);
UpdateServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0);
}

DWORD WINAPI ServiceProc(LPVOID lpParameter)//在这个函数里面添加你想要的操作
{
while(bServiceRunning)
{
Beep(450,150);
Sleep(4000);
}

return 0;
}

BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,DWORD dwWaitHint)
{
SERVICE_STATUS ServiceStatus;
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = dwCurrentState;

if(dwCurrentState == SERVICE_START_PENDING)
{
ServiceStatus.dwControlsAccepted = 0;
}
else
{
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
}

if(dwServiceSpecificExitCode == 0)
{
ServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
}
else
{
ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
}

ServiceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
ServiceStatus.dwCheckPoint = dwCheckPoint;
ServiceStatus.dwWaitHint = dwWaitHint;

if(!SetServiceStatus(hServiceStatus,&ServiceStatus))
{
TerminateService();
return FALSE;
}

return TRUE;
}
EnochShen 2005-02-21
  • 打赏
  • 举报
回复
//注册并启动/终止服务
BOOL RegisterServer(LPCTSTR lpServiceName,LPCTSTR lpDisplayName,LPCTSTR lpBinaryPathName)
{
SC_HANDLE hSCManager = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
if(hSCManager == NULL)
{
return FALSE;
}

if(CreateService(hSCManager,lpServiceName,lpDisplayName,
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,lpBinaryPathName,NULL,NULL,NULL,NULL,NULL))
{
printf("RegisterServer...\r\n");

CloseServiceHandle(hSCManager);
return TRUE;
}
else
{
printf("RegisterServer Error Code = %d\r\n",GetLastError());

CloseServiceHandle(hSCManager);
return FALSE;
}
}

BOOL ExecuteService(LPCTSTR lpServiceName)
{
SC_HANDLE hSCManager,hService;
hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
if(hSCManager == NULL)
{
return FALSE;
}

hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS);
if(hService == NULL)
{
CloseServiceHandle(hSCManager);
return FALSE;
}

if(StartService(hService,0,NULL))
{
printf("StartService...\r\n");

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return TRUE;
}
else
{
printf("StartService Error Code = %d\r\n",GetLastError());

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return FALSE;
}
}

BOOL TerminateService(LPCTSTR lpServiceName)
{
SC_HANDLE hSCManager,hService;
hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
if(hSCManager == NULL)
{
return FALSE;
}

hService = OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS);
if(hService == NULL)
{
CloseServiceHandle(hSCManager);
return FALSE;
}

if(StartService(hService,0,NULL))
{
SERVICE_STATUS ServerStatus;
ControlService(hService,SERVICE_CONTROL_STOP,&ServerStatus);

printf("TerminateService...\r\n");

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return TRUE;
}
else
{
printf("TerminateService Error Code = %d\r\n",GetLastError());

CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return FALSE;
}
}
EnochShen 2005-02-21
  • 打赏
  • 举报
回复
代码太长了,我有一个这样的例子,如果有兴趣话给我发邮件EnochShen@QQ.com

下载代码方式:https://pan.quark.cn/s/a4b39357ea24 在当前的大学生活场景中,众多学生倾向于待在寝室,借助外卖服务解决日常饮食需求,却往往忽略了健康的早餐摄入和必要的体育锻炼。为了修正这种生活方式,我们研发了一款名为“校园外卖的微信小程序”的应用,其核心目标在于鼓励学生离开寝室,深度融入校园生活。这款微信小程序的推出,根植于对改善大学生生活习惯的深切关注。我们明确意识到,虽然外卖服务带来了极大的便利,但长期依赖可能对学生的身体健康造负面影响,而缺乏体育锻炼同样可能引发一系列健康隐患。基于此,我们确立了一个双重目标,即设计一款既能提供高效便捷服务,又能激发学生参与活动的应用程序。 小程序的设计理念将校园视为中心,致力于提供丰富的服务选项。它不仅涵盖了传统的外卖订餐服务,还特别突出了本地化特色和健康饮食理念,例如,与校内食堂建立合作关系,积极推广营养早餐,使学生能够在享受便捷服务的同时,确保摄入健康食品。我们创新性地引入了“走步积分”系统,旨在鼓励学生在取餐或用餐后进行适度步行,通过积累的积分可以兑换优惠券或参与校园组织的各类活动。除此之外,小程序还整合了校园内的体育活动资讯,例如健身房开放时段、体育课程报名信息等,旨在提升学生参与体育活动的热情。 : 1. **外卖服务**:作为小程序的核心功能之一,它支持用户在线订购校内外各式美食,通过与校内食堂的紧密合作,确保提供安全且营养均衡的餐品。 2. **校园服务**:该小程序专注于服务大学校园环境,关注学生群体的特定需求,如健康饮食推广、运动激励机制等,同时提供详尽的校园活动信息。 3. **小程序应用**:作为微信平台上的轻量级应用,用户无需下载安装即可便捷使用,符合移动互联网时...

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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