| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2962 人关注过本帖
标题:编写后台服务程序要怎么做?
只看楼主 加入收藏
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
结帖率:91.53%
收藏
已结贴  问题点数:20 回复次数:6 
编写后台服务程序要怎么做?
比如,一个学校,班级里面的一体机总有人上完课忘了关电脑。
那我可以用C写个最简单的定时关机程序,放在启动项里。
程序的大概思路,也就是判断是否到下班时间,如果到了,就关机,如果没到,就循环间隔一定时间再判断。

但是,这存在一个问题,班级的一体机,总是要展示一些PPT之类的课件,
而当程序做时间判断的时候,程序就会变成“当前”程序,正在讲课的PPT,就会变成“非当前”程序,
这时明明全屏的PPT,但任务栏就会跳出来,然后一些遥控笔什么的,就会“失灵”,
影响正常的教学流程。

所以,我想把这个定时关机的程序,写成一种服务,让它不知不觉的运行,
最主要的是不要影响正在上课的PPT程序。

应该怎么做呢?请大家多多指点,有代码参考就更好了。谢谢!
搜索更多相关主题的帖子: 定时 关机 编写 判断 服务 
2019-10-22 16:23
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
先要解决自动校对时间
2019-10-22 16:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
而当程序做时间判断的时候,程序就会变成“当前”程序,正在讲课的PPT,就会变成“非当前”程序,
不可能的,操作系统每时每刻同时运行着好多程序,如果运行时都跳到前台,那还怎么用

2019-10-22 16:40
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 3楼 rjsp
可是,我编的程序,就是会影响PPT的运行啊,然而,很多服务程序就不会影响。

我的意思是,我想知道怎么让它不影响前台运行的程序。

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2019-10-22 20:24
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 2楼 吹水佬
自动校对时间,可以忽略不计吧,上下也不会差一两分钟

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2019-10-23 08:19
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:20 
以下是引用不懂才问在2019-10-23 08:19:16的发言:

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

如果对时间要求高,取本机时间可能不可靠(人为改动、时钟失电),有可能在正常使用时突然被关机。
windows环境的系统服务编程参考示例:
/*
    scm.c
    系统服务编程(以管理员身份运行)
*/
#include <stdio.h>
#include <windows.h>

//获取基本服务信息
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<ServicesReturned; ++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;
}


2019-10-23 11:34
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:0 
楼主的问题更加适配系统管理员思维,而不是程序员思维。
按照系统管理员思维,无必要就不添加,那就去找系统工具,例如计划任务什么的解决这个问题。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2019-10-23 18:10
快速回复:编写后台服务程序要怎么做?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016749 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved