1、

#include <stdio.h>
#include <Windows.h>
#include <tchar.h> #include <process.h> TCHAR szServiceName[] = _T("MyTestService");
DWORD dwThreadID;
HANDLE hEvent = INVALID_HANDLE_VALUE;
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hServiceStatus; void Init();
BOOL IsServiceInstalled();
BOOL InstallService();
BOOL UninstallService();
BOOL ServiceCtrlStart();
BOOL ServiceCtrlStop();
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);
void LogEvent(LPCTSTR pszFormat, ...); //Usuage
// Install service:
//TestService.exe /install
// Uninstall service:
//TestService.exe /uninstall
// Start service:
//TestService.exe /start
// Stop service:
//TestService.exe /stop int main( int argc, char* argv[] )
{
Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
}; LPSTR lpCmdLine = argv[]; if ( argc == )
{
BOOL bRet; if (stricmp(lpCmdLine, "/install") == )
{
bRet = InstallService();
if ( bRet == TRUE )
{
printf( "Install service %s success", szServiceName );
}else
{
printf( "Install service %s failed", szServiceName );
}
}
else if (stricmp(lpCmdLine, "/uninstall") == )
{
bRet = UninstallService();
if ( bRet == TRUE )
{
printf( "Uninstall service %s success", szServiceName );
}
else
{
printf( "Uninstall service %s failed", szServiceName );
}
}
else if (stricmp(lpCmdLine, "/start") == )
{
bRet = ServiceCtrlStart();
if ( bRet == TRUE )
{
printf( "Start service %s success", szServiceName );
}else
{
printf( "Start service %s failed", szServiceName );
}
}
else if (stricmp(lpCmdLine, "/stop") == )
{
bRet = ServiceCtrlStop();
if ( bRet == TRUE )
{
printf( "Stop service %s success", szServiceName );
}
else
{
printf( "Stop service %s failed", szServiceName );
}
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
}
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
}
return ;
} //初始化相关结构
void Init()
{
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = ;
status.dwServiceSpecificExitCode = ;
status.dwCheckPoint = ;
status.dwWaitHint = ;
} void SubThread(void *_pParam)
{
LogEvent(_T("SubThread - 1"));
Sleep( * );
LogEvent(_T("SubThread - 2"));
_endthread();
} //服务主线程函数,既用户选择开启服务时调用的函数
void WINAPI ServiceMain()
{
// Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP; LogEvent(_T("ServiceMain")); //注册服务控制
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
SetServiceStatus(hServiceStatus, &status); //如下代码可以为启动服务前的准备工作
hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
if ( hEvent == NULL )
{
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Failure to start service"));
return;
}
// //更改服务状态为启动
status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = ;
status.dwWaitHint = ;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status); {
_beginthread( SubThread, , NULL );
} //等待用户选择停止服务,
//当然你也可以把你的服务代码用线程来执行,
//此时这里只需等待线程结束既可。
while ( WaitForSingleObject( hEvent, ) != WAIT_OBJECT_0 )
{
//模拟服务的运行,应用时将主要任务放于此即可
LogEvent(_T("Service runing..."));
}
// //停止服务
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Service stopped"));
} //服务控制函数
void WINAPI ServiceStrl(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(hServiceStatus, &status);
//告诉服务线程停止工作
::SetEvent( hEvent );
LogEvent(_T("want to stopped Service"));
break;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
default:
LogEvent(_T("Bad service request"));
}
} //判断服务是否已安装
BOOL IsServiceInstalled()
{
BOOL bResult = FALSE; //打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM != NULL)
{
//打开服务
SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
bResult = TRUE;
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
return bResult;
} //安装服务
BOOL InstallService()
{
if (IsServiceInstalled())
{
return TRUE;
} //打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
return FALSE;
} // Get the executable file path
TCHAR szFilePath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, MAX_PATH); //创建服务
SC_HANDLE hService = ::CreateService(
hSCM,
szServiceName,
szServiceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
SERVICE_ERROR_NORMAL,
szFilePath,
NULL,
NULL,
_T(""),
NULL,
NULL); if (hService == NULL)
{
::CloseServiceHandle(hSCM);
return FALSE;
} ::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
} //删除服务
BOOL UninstallService()
{
if (!IsServiceInstalled())
{
return TRUE;
}
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
return FALSE;
} SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status); //删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM); if (bDelete)
{
return TRUE;
} LogEvent(_T("Service could not be deleted"));
return FALSE;
} //开启服务
BOOL ServiceCtrlStart()
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService; hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if (hSCM!=NULL)
{
hService=OpenService( hSCM, szServiceName, SERVICE_START);
if (hService!=NULL)
{
//开始Service
bRet = StartService(hService,,NULL);
CloseServiceHandle(hService);
}else
{
bRet = FALSE;
}
CloseServiceHandle(hSCM);
}
else
{
bRet = FALSE;
}
return bRet;
} //停止服务
BOOL ServiceCtrlStop()
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus; hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if (hSCM!=NULL)
{
hService=OpenService( hSCM, szServiceName, SERVICE_STOP|SERVICE_QUERY_STATUS );
if (hService!=NULL)
{
QueryServiceStatus( hService, &ServiceStatus );
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
}
else
{
bRet = FALSE;
}
CloseServiceHandle( hService );
}
else
{
bRet = FALSE;
}
CloseServiceHandle( hSCM );
}
else
{
bRet = FALSE;
}
return bRet;
} //记录日记
void LogEvent(LPCTSTR pFormat, ...)
{
TCHAR chMsg[];
HANDLE hEventSource;
LPTSTR lpszStrings[];
va_list pArg; va_start(pArg, pFormat);
_vstprintf(chMsg, pFormat, pArg);
va_end(pArg); lpszStrings[] = chMsg; hEventSource = RegisterEventSource(NULL, szServiceName);
if (hEventSource != NULL)
{
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, , , NULL, , , (LPCTSTR*) &lpszStrings[], NULL);
DeregisterEventSource(hEventSource);
}
}

2、CreateProcess

http://www.jb51.net/article/66511.htm

3、

Windows服务程序_测试01的更多相关文章

  1. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  2. C#写Windows Service(windows服务程序)

    背景:        要学习使用一个新东西,我们必须知道他是个什么东西.对于我们此次研究的windows服务来说,他又是个什么东西,其实也没有什么高深的了. windows service概述: 一个 ...

  3. .net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)

    .net Windows服务程序和安装程序制作 最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作 ...

  4. 用Visual C#创建Windows服务程序

    一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT.Windows 2000和Windows XP等操作系统下用户环境以外的程序.在以前,编写Wind ...

  5. 用C/C++创建windows服务程序

    转载:https://blog.csdn.net/chenyujing1234/article/details/8023816 一.演示过程下方代码演示了如何使用vs(C/C++)创建windows服 ...

  6. Redis windows版安装测试

    1.下载 下载地址是 https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100 ,我选择的是Redis-x64-3.2.10 ...

  7. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  8. 关于开发Windows服务程序容易搞混的地方!

    在开发Windows服务程序时,我们一般需要添加安装程序,即:serviceInstaller,里面有几个关于名称属性,你都搞明白了吗? 1.Description:表示服务说明(描述服务是干什么的) ...

  9. Windows服务程序和安装程序制作

    转:http://www.cr173.com/html/15350_1.html 本文介绍了如何用C#创建.安装.启动.监控.卸载简单的Windows Service 的内容步骤和注意事项. 一.创建 ...

随机推荐

  1. ThinkPHP简单结构介绍!

    thinkPHP简单结构介绍: application : 应用 extend:扩展 扩展内库 public:入口文件 index.php 在里面 runtime:缓存文件(里面的文件可以随便删除) ...

  2. hdu4975 网络流解方程组(网络流+dfs判环或矩阵DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4975 A simple Gaussian elimination problem. Time Limit: 20 ...

  3. [Linux]ssh相关问题

    ssh链接不上的最可能原因是防火墙没关,一般提示“connection refused”. 可以使用这个命令查看:#service iptables status 暂时关闭iptables,重启后还会 ...

  4. Birt报表安装及制作

    一.Birt报表安装 二.Birt报表设置 1. file--> new --> Project 如下图所示创建报表工程. 输入工程名称后,创建完成. 2.创建报表 创建报表 完成创建. ...

  5. 【php】---mysql语法增、删、改、查---【巷子】

    1.mysql基本语法 001.增 语法:          insert into 表名 (列1,列2,列3) values(值1,值2,值3)     批量插入:插入insert-插入多行   语 ...

  6. yii2设置发送邮件的一些配置

    错误提示: Warning: stream_socket_enable_crypto(): this stream does not support SSL/crypto in C:\xampp\ht ...

  7. Oracle等待事件之db file sequential read/ db file parallel read

    1.产生原因 db file sequential read这个是非常常见的I/O 相关的等待事件.表示发生了与索引扫描相关的等待.意味着I/O 出现了问题,通常表示I/O竞争或者I/O 需求太多. ...

  8. MTA---smtp(25,postfix,sendmail),Pop3(110,Devocot), MUA(foxmail) IMAP(server,client rsync)

    利用telnet进行SMTP的验证 =========先计算BASE64编码的用户名密码,认证登录需要用到=========== [crazywill@localhost crazywill]$ pe ...

  9. Python之numpy基本指令

    https://blog.csdn.net/mmm305658979/article/details/78745637 # -*- coding: utf-8 -*- 多加练习才是真 import n ...

  10. python 定义类 学习1

    此时的d1就是类Dog的实例化对象 实例化,其实就是以Dog类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名 # 定义类模板 class dog(object): # 定义类的方法功能 # ...