写一个能后台服务的程序c语言,编写后台服务程序要怎么做?

得分:20

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

以下是引用不懂才问在2019-10-23 08:19:16的发言:

自动校对时间,可以忽略不计吧,上下也不会差一两分钟

如果对时间要求高,取本机时间可能不可靠(人为改动、时钟失电),有可能在正常使用时突然被关机。

windows环境的系统服务编程参考示例:

/*

scm.c

系统服务编程(以管理员身份运行)

*/

#include

#include

//获取基本服务信息

BOOL _GetServiceStatus(SC_HANDLE hScm,

LPENUM_SERVICE_STATUS pServices,

DWORD cbBufSize,

LPDWORD lpServicesReturned)

{

DWORD cbBytesNeeded = 0;

DWORD ResumeHandle = 0;

return EnumServicesStatus(hScm, SERVICE_WIN32, SERVICE_STATE_ALL,

pServices, cbBufSize,

&cbBytesNeeded, lpServicesReturned, &ResumeHandle);

}

//获取详细服务信息

BOOL _GetServiceConfig(SC_HANDLE hScm,

LPENUM_SERVICE_STATUS pServices,

DWORD ServiceNum,

LPQUERY_SERVICE_CONFIG pServicesInfo,

DWORD cbBufSize)

{

SC_HANDLE hService = NULL;

DWORD cbBytesNeeded = 0;

BOOL ret = FALSE;

if ((hService = OpenService(hScm, pServices[ServiceNum].lpServiceName, SERVICE_ALL_ACCESS)) != NULL)

{

ret = QueryServiceConfig(hService, pServicesInfo, cbBufSize, &cbBytesNeeded);

CloseServiceHandle(hService);

}

return ret;

}

//列印服务信息

void _PrintServices(LPENUM_SERVICE_STATUS pServices,

DWORD ServiceNum,

LPQUERY_SERVICE_CONFIG pServicesInfo)

{

printf("\n%d\n", ServiceNum);

printf("服务名称: %s\n", pServices[ServiceNum].lpServiceName);

printf("显示名称: %s\n", pServices[ServiceNum].lpDisplayName);

printf("启动状态: ");

switch(pServices[ServiceNum].ServiceStatus.dwCurrentState)

{

case SERVICE_PAUSED:

{

printf("暂停");

break;

}

case SERVICE_RUNNING:

{

printf("运行");

break;

}

case SERVICE_STOPPED:

{

printf("停止");

break;

}

default:

{

printf("其它");

}

}

printf("\n程序路径: %s\n", pServicesInfo->lpBinaryPathName);

printf("启动类型: ");

switch(pServicesInfo->dwStartType)

{

case SERVICE_AUTO_START:

{

printf("自动\n");

break;

}

case SERVICE_DEMAND_START:

{

printf("手动\n");

break;

}

case SERVICE_DISABLED:

{

printf("禁止\n");

break;

}

default:

{

printf("其它\n");

}

}

}

//枚举服务信息

void _EnumServices(SC_HANDLE hScm)

{

DWORD cbBufSize_Status = 256*1024;     //此缓冲区要足够大,最大为256K

DWORD cbBufSize_Config = 8*1024;       //此缓冲区要足够大,最大为8K

TCHAR cbBuf_Status[cbBufSize_Status];

TCHAR cbBuf_Config[cbBufSize_Config];

DWORD ServicesReturned = 0;

LPENUM_SERVICE_STATUS pServices = (LPENUM_SERVICE_STATUS)cbBuf_Status;

LPQUERY_SERVICE_CONFIG pServicesInfo = (LPQUERY_SERVICE_CONFIG)cbBuf_Config;

if (_GetServiceStatus(hScm, pServices, cbBufSize_Status, &ServicesReturned))

{

DWORD i = 0;

for (i=0; i

{

if (_GetServiceConfig(hScm, pServices, i, pServicesInfo, cbBufSize_Config))

{

_PrintServices(pServices, i, pServicesInfo);

}

if (i%30==0 && i!=0)

{

printf("\n");

system("pause");

}

}

}

}

//启动服务

void _StartService(SC_HANDLE hScm, LPCTSTR lpServiceName)

{

SC_HANDLE hService = NULL;

if ((hService = OpenService(hScm, lpServiceName, SERVICE_ALL_ACCESS)) != NULL)

{

SERVICE_STATUS status;

if (QueryServiceStatus(hService, &status))

{

if (status.dwCurrentState == SERVICE_STOPPED)

{

StartService(hService, 0, NULL);

}

}

CloseServiceHandle(hService);

}

}

//停止服务

void _StopService(SC_HANDLE hScm, LPCTSTR lpServiceName)

{

SC_HANDLE hService = NULL;

if ((hService = OpenService(hScm, lpServiceName, SERVICE_ALL_ACCESS)) != NULL)

{

SERVICE_STATUS status;

if (QueryServiceStatus(hService, &status))

{

if (status.dwCurrentState != SERVICE_STOPPED)

{

ControlService(hService, SERVICE_CONTROL_STOP, &status);

}

}

CloseServiceHandle(hService);

}

}

//创建服务

BOOL _CreateService(SC_HANDLE hScm,             //用OpenSCManager打开的句柄

LPCTSTR lpServiceName,      //服务名称

LPCTSTR lpDisplayName,      //显示名称

DWORD dwStartType,          //启动方式:

//    SERVICE_AUTO_START    自动

//    SERVICE_DEMAND_START  手动

//    SERVICE_DISABLED      禁用

LPCTSTR lpBinaryPathName)   //程序路径

{

SC_HANDLE hService = NULL;

hService = CreateService(hScm, lpServiceName, lpDisplayName,

SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,

dwStartType, SERVICE_ERROR_NORMAL,

lpBinaryPathName, NULL, NULL, NULL, NULL, NULL);

if (hService != NULL)

{

CloseServiceHandle(hService);

return TRUE;

}

return FALSE;

}

//删除服务

BOOL _DeleteService(SC_HANDLE hScm, LPCTSTR lpServiceName)

{

_StopService(hScm, lpServiceName);

SC_HANDLE hService = NULL;

BOOL ret = FALSE;

if ((hService = OpenService(hScm, lpServiceName, SERVICE_ALL_ACCESS)) != NULL)

{

ret = DeleteService(hService);

CloseServiceHandle(hService);

}

return ret;

}

//设置启动类型 dwStartType

//  SERVICE_AUTO_START   自动

//  SERVICE_DEMAND_START 手动

//  SERVICE_DISABLED     禁止

BOOL _ChangeServiceConfig(SC_HANDLE hScm, LPCTSTR lpServiceName, DWORD dwStartType)

{

SC_HANDLE hService = NULL;

BOOL ret = FALSE;

if ((hService = OpenService(hScm, lpServiceName, SERVICE_ALL_ACCESS)) != NULL)

{

SC_LOCK sclLock = LockServiceDatabase(hScm);

ret = ChangeServiceConfig(hService,

SERVICE_NO_CHANGE,

dwStartType,

SERVICE_NO_CHANGE,

NULL, NULL, NULL, NULL, NULL, NULL, NULL);

UnlockServiceDatabase(sclLock);

CloseServiceHandle(hService);

}

return ret;

}

void _test(void)

{

SC_HANDLE hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hScm == NULL)

{

printf("调用OpenSCManager()失败\n尝试“以管理员身份运行”\n");

return;

}

_EnumServices(hScm);

//_StartService(hScm, "我的服务");

//_StopService(hScm, "我的服务");

//_CreateService(hScm, "我的服务", "我的服务", SERVICE_DEMAND_START, "C:\\TEMP\\_Test.exe");

//_DeleteService(hScm, "我的服务");

//_ChangeServiceConfig(hScm, "我的服务", SERVICE_DISABLED);

CloseServiceHandle(hScm);

}

int main(void)

{

_test();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值