创建Windows系统服务

本文介绍了一个使用C++编写的程序,该程序能够将Apache Tomcat作为Windows服务进行安装和卸载,并通过JNI调用Java代码实现服务的主要功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"
#include <Windows.h>
#include <WinSvc.h>
#include <EventSys.h>
#include <jni.h>
#include "invoke.h "


static TCHAR SERVICE_NAME[] = _T("Tomcat7");
static TCHAR DISPLAY_NAME[] =_T("Apache Tomcat 7");
static SERVICE_STATUS js_status;
static SERVICE_STATUS_HANDLE js_status_handle;
static TCHAR prog_name[500];
static bool service_running = false;
const LPWSTR LOG_MSG = L"By Java Service";//L是个宏
void WINAPI JSCtrlHandle(DWORD);//32位系统DWORD位64位,64位系统DWORD为128位,是个逻辑类型

void WINAPI JSCtrlHandle(DWORD opcode)
{
switch(opcode)
{
case SERVICE_CONTROL_STOP:
js_status.dwCurrentState = SERVICE_STOPPED;
js_status.dwCheckPoint = 0;
js_status.dwWaitHint = 100;
SetServiceStatus(js_status_handle, &js_status);
service_running = false;
break;
default:
break;
}
}

void WINAPI JSMain(DWORD argc,LPTSTR *argv)
{

js_status.dwServiceType = SERVICE_WIN32;
js_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
js_status.dwWin32ExitCode = S_OK;
js_status.dwServiceSpecificExitCode = 0;

js_status.dwCurrentState = SERVICE_START_PENDING;
js_status.dwCheckPoint = 0;
js_status.dwWaitHint = 0;

js_status_handle = RegisterServiceCtrlHandler(SERVICE_NAME,JSCtrlHandle);

if (js_status_handle)
{
js_status.dwWin32ExitCode = S_OK;
js_status.dwCurrentState = SERVICE_RUNNING;
js_status.dwCheckPoint = 0;
js_status.dwWaitHint = 0;
if (SetServiceStatus(js_status_handle,&js_status) != 0)
{
service_running = true;
invokeJava("info/lidongbo/TinyServer");
js_status.dwCurrentState = SERVICE_STOPPED;
js_status.dwCheckPoint = 0;
js_status.dwWaitHint = 0;
SetServiceStatus(js_status_handle, &js_status);
}
}
}
int insJavaService()
{
TCHAR dir_path[1000];
GetCurrentDirectory(1000,dir_path);
_tcscat(dir_path,_T("\\"));
_tcscat(dir_path,prog_name);
_tprintf(_T("***********\n"));
_tprintf(dir_path);
_tprintf(_T("\n***********\n"));

TCHAR tomcatPath[1000]=_T("D:\\tomcat6-DumexQS\\bin\\tomcat6.exe");


SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE srv = CreateService(scm,

SERVICE_NAME,DISPLAY_NAME, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
tomcatPath,NULL,NULL,NULL,NULL,NULL);
if (NULL == srv)
{
CloseServiceHandle(scm);
return 1;
}
StartService(srv,0,NULL);
CloseServiceHandle(srv);
CloseServiceHandle(scm);
return 0;
}
int unsJavaService()
{
SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE srv = OpenService(scm,SERVICE_NAME,SERVICE_ALL_ACCESS);
if (NULL == srv)
{
CloseServiceHandle(scm);
return 1;
}
ControlService(srv,SERVICE_CONTROL_STOP,&js_status);
DeleteService(srv);
CloseServiceHandle(srv);
CloseServiceHandle(scm);

return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{

_tcscpy(prog_name,argv[0]);
if (argc > 1)
{
if (0 == _tcscmp(argv[1],_T("/i")))
{
int ret_code = insJavaService();
if (0 == ret_code)
{
_tprintf(_T("Service %s registered!\n"),SERVICE_NAME);
}else{
_tprintf(_T("Can't register service %s, error code is %d\n"),SERVICE_NAME,ret_code);
}
}
if (0==_tcscmp(argv[1],_T("/u")))
{
int ret_code = unsJavaService();
if (0 == ret_code)
{
_tprintf(_T("Uninstalled Service %s!\n"),SERVICE_NAME);
}else{
_tprintf(_T("Can't uninstall service %s, error code is %d\n"),SERVICE_NAME,ret_code);
}
}
}else
{
/**
typedef struct _SERVICE_TABLE_ENTRY {
LPTSTR lpServiceName;
LPSERVICE_MAIN_FUNCTION lpServiceProc;
} SERVICE_TABLE_ENTRY
, *LPSERVICE_TABLE_ENTRY;
*/
SERVICE_TABLE_ENTRY srvs[] = {
{
SERVICE_NAME,
JSMain
},
{
NULL,
NULL
}
};
StartServiceCtrlDispatcher(srvs);
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值