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

本文实例讲述了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("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语言程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值