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

 更新时间:2015年06月30日 15:12:52   作者:liujian0616  
这篇文章主要介绍了C语言实现在windows服务中新建进程的方法,涉及C语言进程操作的相关技巧,需要的朋友可以参考下

本文实例讲述了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

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

相关文章

  • C/C++ 函数原理传参示例详解

    C/C++ 函数原理传参示例详解

    这篇文章主要为大家介绍了C/C++ 函数原理传参示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • MFC之ComboBox控件用法实例教程

    MFC之ComboBox控件用法实例教程

    这篇文章主要介绍了MFC之ComboBox控件用法,包括了ComboBox控件常见的各类用法,非常具有实用价值,需要的朋友可以参考下
    2014-09-09
  • 零基础详解C语言指针进阶

    零基础详解C语言指针进阶

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-02-02
  • 详解Linux的SOCKET编程

    详解Linux的SOCKET编程

    这篇文章主要介绍了Linux的SOCKET编程,并且进行了实例讲解,需要的朋友可以参考下
    2015-08-08
  • C语言实现桶排序的方法示例

    C语言实现桶排序的方法示例

    这篇文章主要介绍了C语言实现桶排序的方法,简单描述了桶排序的概念、原理并结合实例形式分析了C语言实现桶排序算法的具体操作技巧,需要的朋友可以参考下
    2018-01-01
  • C++如何实现BCD码和ASCII码的相互转换

    C++如何实现BCD码和ASCII码的相互转换

    这篇文章主要介绍了C++实现BCD码和ASCII码互转,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 二分图匹配实例代码及整理

    二分图匹配实例代码及整理

    这篇文章主要介绍了二分图匹配实例代码及整理的相关资料,这里提供了三种方法包括匈牙利算法,KM算法,多重匹配,需要的朋友可以参考下
    2017-07-07
  • C语言形参与实参使用的差别讲解

    C语言形参与实参使用的差别讲解

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    2023-02-02
  • C++实现寻找最低公共父节点的方法

    C++实现寻找最低公共父节点的方法

    这篇文章主要介绍了C++实现寻找最低公共父节点的方法,是数据结构中二叉树的一个经典算法,有一定的借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C语言使用ffmpeg和sdl实现多路音频播放

    C语言使用ffmpeg和sdl实现多路音频播放

    这篇文章主要为大家详细介绍了一种基于ffmpeg和sdl实现的音频多路混合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2023-06-06

最新评论