C语言实现在windows服务中新建进程的方法
本文实例讲述了C语言实现在windows服务中新建进程的方法。分享给大家供大家参考。具体如下:
运行环境:visualstdio2008
文件名:testService.c
#include<windows.h> #include<stdio.h> #include<time.h> #include<tchar.h> HANDLEhMutex; SERVICE_STATUSServiceStatus; SERVICE_STATUS_HANDLEServiceStatusHandle; PROCESS_INFORMATIONpi; //ServiceControlHandlerFunction voidWINAPICmdControl(DWORDdwCode) { switch(dwCode) { caseSERVICE_CONTROL_PAUSE: ServiceStatus.dwCurrentState=SERVICE_PAUSED; break; caseSERVICE_CONTROL_CONTINUE: ServiceStatus.dwCurrentState=SERVICE_RUNNING; break; caseSERVICE_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("SetServiceStatusinCmdControlinSwitchError!\n"); } return; caseSERVICE_CONTROL_INTERROGATE: break; default: break; } if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0) { printf("SetServiceStatusinCmdControloutSwitchError!\n"); } return; } intWriteToLog(char*str) { FILE*log; log=fopen("dma_ws.log","a+"); if(log==NULL) return-1; fprintf(log,"%s\n",str); fclose(log); return0; } //ServiceServiceMainFunction voidWINAPICmdStart(DWORDdwArgc,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("RegisterServiceCtrlHandlerError!\n"); return; } ServiceStatus.dwCurrentState=SERVICE_RUNNING; ServiceStatus.dwCheckPoint=0; ServiceStatus.dwWaitHint=0; if(SetServiceStatus(ServiceStatusHandle,&ServiceStatus)==0) { printf("SetServiceStatusinCmdStartError!\n"); return; } //接下来可以做你要做的事了,我这里新建了一个进程 STARTUPINFOsi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); si.wShowWindow=true; ZeroMemory(&pi,sizeof(pi)); charbuf[100]={0}; TCHARszCommandLine[]=TEXT("C:\\ProgramFiles(x86)\\IronPython2.7.1\\ipy.exeC:\\DXMonitorSystem\\DXHttpServer.py"); TCHARcwd[]=TEXT("C:\\DXMonitorSystem"); if(!CreateProcess(NULL,//在服务运行后新建了一个进程,实际的工作都由新建的进程完成 szCommandLine, NULL, NULL, FALSE, 0, NULL, cwd,//这个参数必不可少,而且要是绝对路径,不然服务会找不到创建新进程所需文件所在目录 &si, &pi)) { sprintf(buf,"CreateProcessfailed(%d).\n",GetLastError()); WriteToLog(buf); } else { //不使用的句柄最好关掉 //CloseHandle(pi.hThread); //CloseHandle(pi.hProcess); sprintf(buf,"newprocessID:%d\n",pi.dwProcessId); sprintf(buf+strlen(buf),"newprocessmasterthreadID:%d\n",pi.dwThreadId); WriteToLog(buf); } WriteToLog("hello,world\n"); return; } intmain() { SERVICE_TABLE_ENTRYDispatchTable[]= { {TEXT("ntkrnl"),CmdStart}, {NULL,NULL} }; StartServiceCtrlDispatcher(DispatchTable); //注意:CmdStart函数 return0; }
使用方法:
安装服务:sccreatetestServicebinpath=c:\testService.exe
删除服务:scdeletetestService
希望本文所述对大家的C语言程序设计有所帮助。