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语言语法和语义中一个很重要的知识点,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言 指针综合解析

    C语言 指针综合解析

    指针可以表示一个变更的地址,在计算机程序中,通常表示内存地址,存储数据的地址,下面这篇文章主要给大家综合的介绍了关于C语言指针的本质与用法
    2021-11-11
  • 记录一个C++在条件查询时遇到的问题(推荐)

    记录一个C++在条件查询时遇到的问题(推荐)

    这篇文章主要介绍了记录一个C++在条件查询时遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • C++中引用&与取地址&的区别分析

    C++中引用&与取地址&的区别分析

    这篇文章主要介绍了C++中引用&与取地址&的区别,有助于C++初学者更好的掌握指针的概念及用法,需要的朋友可以参考下
    2014-09-09
  • C++位操作的常见用法小结

    C++位操作的常见用法小结

    这篇文章主要介绍了C++位操作的常见用法,包括了判断奇偶、交换两个数、正负转换、求绝对值等,需要的朋友可以参考下
    2014-09-09
  • 浅谈C++中派生类对象的内存布局

    浅谈C++中派生类对象的内存布局

    下面小编就为大家带来一篇浅谈C++中派生类对象的内存布局。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码

    这篇文章主要介绍了C语言字符串快速压缩算法代码,将字符串中连续出席的重复字母进行压缩,其主要的压缩字段的格式为”字符重复的次数+字符”。有需要的小伙伴参考下吧。
    2015-03-03
  • C语言数组快速入门详细讲解

    C语言数组快速入门详细讲解

    数组是一组有序的数据的集合,数组中元素类型相同,由数组名和下标唯一地确定,数组中数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素
    2022-05-05
  • sizeof()的简单介绍

    sizeof()的简单介绍

    sizeof操作符以字节形式给出了其操作数的存储大小
    2013-04-04
  • 简单谈谈C++ 头文件系列之(iosfwd)

    简单谈谈C++ 头文件系列之(iosfwd)

    本文给大家分享的是小编关于头文件系列的(iosfwd)的简单讲解,所谓iosfwd,其实就是“input output stream forward”,下面我们来详细看看
    2017-02-02

最新评论