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语言程序设计有所帮助。