#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;
}