• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C语言实现在windows服务中新建进程的方法

c语言 搞代码 4年前 (2022-01-06) 33次浏览 已收录 0个评论

这篇文章主要介绍了C语言实现在windows服务中新建进程的方法,涉及C语言进程操作的相关技巧,需要的朋友可以参考下

本文实例讲述了C语言实现在windows服务中新建进程的方法。分享给大家供大家参考。具体如下:

运行环境:visual stdio 2008

文件名:testService.c

 #include  #include  #include  #include  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<em style="color:transparent">来源gao.dai.ma.com搞@代*码网</em>("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

希望本文所述对大家的C语言程序设计有所帮助。

以上就是C语言实现在windows服务中新建进程的方法的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C语言实现在windows服务中新建进程的方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址