免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2012 | 回复: 2
打印 上一主题 下一主题

windows后台服务无法启动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-18 14:11 |只看该作者 |倒序浏览
代码如下,报错为1060,平台是VS2005


// SCM_Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <winsvc.h>
#include "App.h"
using namespace std;

static struct
{
    HANDLE service_thread;   /* thread service/monitor handle */
    DWORD  service_thread_id;/* thread service/monitor ID */
    HANDLE service_init;     /* controller thread init mutex */
    HANDLE service_term;     /* NT service thread kill signal */
    SERVICE_STATUS ssStatus;
    SERVICE_STATUS_HANDLE hServiceStatus;
} globdat;

static char const* signal_arg = NULL;
static char op_service_name[256] = {"openPlant"};
static char op_display_name[256] = {"openPlant"};

HANDLE shutdown_event;
HANDLE restart_event;

static int ReportStatusToSCMgr(int currentState, int exitCode, int waitHint)
{
    static int checkPoint = 1;
    int rv = 0;
   
    if (globdat.hServiceStatus)
    {
        if (currentState == SERVICE_RUNNING) {
            globdat.ssStatus.dwWaitHint = 0;
            globdat.ssStatus.dwCheckPoint = 0;
            globdat.ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
        }
        else if (currentState == SERVICE_STOPPED) {
            globdat.ssStatus.dwWaitHint = 0;
            globdat.ssStatus.dwCheckPoint = 0;
            if (!exitCode && globdat.ssStatus.dwCurrentState != SERVICE_STOP_PENDING) {
                // An unexpected exit?  Better to error!
                exitCode = 1;
            }
            if (exitCode) {
                globdat.ssStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
                globdat.ssStatus.dwServiceSpecificExitCode = exitCode;
            }
        }
        else {
            globdat.ssStatus.dwCheckPoint = ++checkPoint;
                globdat.ssStatus.dwControlsAccepted = 0;
            if(waitHint)
                globdat.ssStatus.dwWaitHint = waitHint;
        }

        globdat.ssStatus.dwCurrentState = currentState;
        
        rv = SetServiceStatus(globdat.hServiceStatus, &globdat.ssStatus);
    }
    return(rv);
}
void WINAPI ServiceControlHandler( DWORD controlCode )
{
        switch ( controlCode )
        {
                case SERVICE_CONTROL_SHUTDOWN:
                case SERVICE_CONTROL_STOP:
            ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 30000);
                        SetEvent(shutdown_event);
                        return;

                case SERVICE_OP_RESTART:
            ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 30000);
                        SetEvent(restart_event);
                        return;
        }
    ReportStatusToSCMgr(globdat.ssStatus.dwCurrentState, NO_ERROR, 0);            
}
static int signal_service_transition(SC_HANDLE schService, DWORD signal, DWORD pending, DWORD complete)
{
    if (signal && !ControlService(schService, signal, &globdat.ssStatus))
        return FALSE;
   
    do {
        Sleep(1000);   
        if (!QueryServiceStatus(schService, &globdat.ssStatus))
            return FALSE;
    } while (globdat.ssStatus.dwCurrentState == pending);
        
    return (globdat.ssStatus.dwCurrentState == complete);
}

int op_service_start(int argc, char *argv[])
{
    fprintf(stderr, "Starting the %s service\n", op_display_name);
   
    SC_HANDLE schService;
    SC_HANDLE schSCManager;
    const char **start_argv;
    int rv;

    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (!schSCManager)
        {
        fprintf(stderr, "Failed to open the WinNT service manager\n");           
    }       

    schService = OpenService(schSCManager, (LPCTSTR)op_service_name, SERVICE_STOP);
    if (!schService) {
        rv = GetLastError();
        fprintf(stderr, "Failed to open the %s service\n", op_display_name );
                rv = GetLastError();
        CloseServiceHandle(schSCManager);
        return (rv);
    }

    if (QueryServiceStatus(schService, &globdat.ssStatus)
        && (globdat.ssStatus.dwCurrentState == SERVICE_RUNNING)) {
        fprintf(stderr, "Service %s is already started!\n", op_service_name);
        CloseServiceHandle(schService);
        CloseServiceHandle(schSCManager);
        return 0;
    }
   
    start_argv = (const char **)malloc((argc + 1) * sizeof(const char **));
    memcpy(start_argv, argv, argc * sizeof(char **));
    start_argv[argc] = NULL;

    if (StartService(schService, argc, (LPCTSTR*)start_argv)
        && signal_service_transition(schService, 0,                          //test only
                                     SERVICE_START_PENDING,
                                     SERVICE_RUNNING))
        {
        rv = 0;
                fprintf(stderr, "The %s service has started\n", op_display_name);
    }else
        rv = GetLastError();
   
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);

       
    return rv;
}

int _tmain(int argc, char * argv[])
{
        op_service_start(argc, argv);
        getchar();
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-04-18 14:41 |只看该作者
服务名写错了,找不到这个名称的服务

论坛徽章:
0
3 [报告]
发表于 2008-04-18 14:47 |只看该作者

回复 #2 nicolas.shen 的帖子

这是我自己的一个服务,在后台运行的,不是系统服务。
问题是我启用系统服务也不能启动...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP