用C实现windows服务-在服务中新建进程

运行环境:visual stdio 2008   文件名:testService.c
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <tchar.h>
 
HANDLE hMutex;
SERVICE_STATUS        ServiceStatus;
SERVICE_STATUS_HANDLE ServiceStatusHandle;
 
PROCESS_INFORMATION pi;
//Service Control Handler Function 
void WINAPI CmdControl(DWORD dwCode)
{
        switch(dwCode)
        {
        case SERVICE_CONTROL_PAUSE:
                ServiceStatus.dwCurrentState = SERVICE_PAUSED;
                break;
 
        case SERVICE_CONTROL_CONTINUE:
                ServiceStatus.dwCurrentState = SERVICE_RUNNING;
                break;
 
        case SERVICE_CONTROL_STOP:
                WaitForSingleObject(hMutex,INFINITE);
                //if (WaitForSingleObject(pi.hProcess, 5000) != WAIT_OBJECT_0)
                TerminateProcess(pi.hProcess,0);  //由于我自己在服务里建了一个进程,所以当服务停止时需要将建的进程也停掉
 
                ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
                ServiceStatus.dwWin32ExitCode = 0;
                ServiceStatus.dwCheckPoint    = 0;
                ServiceStatus.dwWaitHint      = 0;
                if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
                {
                        printf("SetServiceStatus in CmdControl in Switch Error !\n");
                }
                return ;
 
        case SERVICE_CONTROL_INTERROGATE:
                break;
 
        default:
                break;
        }
 
        if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
        {
                printf("SetServiceStatus in CmdControl out Switch Error !\n");
        }
 
        return ;
}
 
int WriteToLog(char* str)
{
    FILE* log;
    log = fopen("dma_ws.log", "a+");
    if (log == NULL)
        return -1;  
    fprintf(log, "%s\n", str);    
    fclose(log);    
    return 0;
}
 
//Service ServiceMain Function 
void WINAPI CmdStart(DWORD dwArgc,LPTSTR *lpArgv)
{
         
        ServiceStatus.dwServiceType             = SERVICE_WIN32;
        ServiceStatus.dwCurrentState            = SERVICE_START_PENDING;
        ServiceStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP
                                                    | SERVICE_ACCEPT_PAUSE_CONTINUE;
        ServiceStatus.dwServiceSpecificExitCode = 0;
        ServiceStatus.dwWin32ExitCode           = 0;
        ServiceStatus.dwCheckPoint              = 0;
        ServiceStatus.dwWaitHint                = 0;
 
        ServiceStatusHandle=RegisterServiceCtrlHandler(TEXT("ntkrnl"),CmdControl); //注册控制响应程序
        if (ServiceStatusHandle == 0)
        {
                printf("RegisterServiceCtrlHandler Error !\n");
                return ;
        }
 
        ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        ServiceStatus.dwCheckPoint   = 0;
        ServiceStatus.dwWaitHint     = 0;
         
        if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0)
        {
                printf("SetServiceStatus in CmdStart Error !\n");
                return ;
        }
        // 接下来可以做你要做的事了,我这里新建了一个进程
        STARTUPINFO si;
 
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        si.wShowWindow = true;
        ZeroMemory( &pi, sizeof(pi) );
        char buf[100] ={0};
        TCHAR szCommandLine[] = TEXT("C:\\Program Files (x86)\\IronPython 2.7.1\\ipy.exe C:\\DXMonitorSystem\\DXHttpServer.py");
        TCHAR cwd[] = TEXT("C:\\DXMonitorSystem");
        if (!CreateProcess(NULL,   //在服务运行后新建了一个进程,实际的工作都由新建的进程完成
            szCommandLine,
            NULL,
            NULL,
            FALSE,
            0,
            NULL,
            cwd,  //这个参数必不可少,而且要是绝对路径,不然服务会找不到创建新进程所需文件所在目录
            &si,
            &pi))
        {
             
            sprintf(buf, "CreateProcess failed (%d).\n", GetLastError());
            WriteToLog(buf);
        }
        else
        {
            // 不使用的句柄最好关掉
            //CloseHandle(pi.hThread);
            //CloseHandle(pi.hProcess);
            sprintf(buf, "new process ID:%d\n",pi.dwProcessId);
            sprintf(buf+strlen(buf), "new process master thread ID:%d\n",pi.dwThreadId);
            WriteToLog(buf);
        }
 
        WriteToLog("hello,world\n");
        return ;
}
 
 
int main()
{
        SERVICE_TABLE_ENTRY DispatchTable[] =
        {
                {TEXT("ntkrnl"),CmdStart},
                {NULL    ,NULL    }
        };
        StartServiceCtrlDispatcher(DispatchTable); //注意:CmdStart函数
        return 0;
}


使用方法:

安装服务:sc create testService binpath= c:\testService.exe

删除服务: sc delete testService 

转载请注明出处:http://blog.youkuaiyun.com/liujian0616/article/details/7950472

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值