windows c语言 进程信息,C++_C语言实现在windows服务中新建进程的方法,本文实例讲述了C语言实现在win - phpStudy...

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语言程序设计有所帮助。相关阅读:

jquery五角星评分插件示例分享

iOS开发之路--微博OAuth授权_取得用户授权的accessToken

win10系统的电脑怎么限制别人使用的时间?

Win10 Server预览版10147大量截图曝光

设置contenteditable属性可编辑HTML标签的内容(可代替textarea)

win10文件夹打不开显示正在处理中该怎么办?

Javascript闭包用法实例分析

Android GPS定位测试(附效果图和示例)

原生JS实现风箱式demo,并封装了一个运动框架(实例代码)

php实现SAE上使用storage上传与下载文件的方法

CSS3新属性transition-property transform box-shadow实例学习

SQL_Server全文索引的用法解析

Android 广播大全 Intent Action 事件详解

Mac下怎么给文件添加注释以方便管理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值