#include "stdafx.h" LPWSTR ServiceName = L"BalloonService"; LPWSTR DisplayName = L"Balloon Service"; CService srvc; DWORD WINAPI HandlerEx(DWORD ctlcode, DWORD evtype, PVOID evdata, PVOID context) { CService *service = static_cast(context); return CService::HandlerExThunk(service, ctlcode, evtype, evdata); } void __stdcall ServiceMainEx(DWORD argc, TCHAR* argv[]) { srvc.m_StatusHandle = RegisterServiceCtrlHandlerEx(ServiceName, HandlerEx, &srvc); CService::ServiceMainThunk(&srvc, argc, argv); } SERVICE_TABLE_ENTRY serviceTableEx[] = { { ServiceName, (LPSERVICE_MAIN_FUNCTION) ServiceMainEx}, { NULL, NULL} }; ULONG _cdecl wmain( __in ULONG argc, __in_ecount(argc) PWCHAR argv[] ) { if(argc == 2) { if (_tcsicmp(L"-i", argv[1]) == 0) { InstallService(); } else if (_tcsicmp(L"-u", argv[1]) == 0) { UninstallService(); } else if (_tcsicmp(L"-r", argv[1]) == 0) { ServiceRun(); } else if (_tcsicmp(L"-s", argv[1]) == 0) { ServiceControl(SERVICE_CONTROL_STOP); } else if (_tcsicmp(L"status", argv[1]) == 0) { SC_HANDLE scm, service; scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!scm) { ErrorHandler("OpenSCManager", GetLastError()); } service = OpenService(scm, ServiceName, SERVICE_ALL_ACCESS); if (!service) { ErrorHandler("OpenService", GetLastError()); } printf("STATUS: "); srvc.GetStatus(service); } else if (_tcsicmp(L"config", argv[1]) == 0) { GetConfiguration(); } else if (_tcsicmp(L"help", argv[1]) == 0) { ShowUsage(); } else { ShowUsage(); } } else { BOOL success; success = StartServiceCtrlDispatcher(serviceTableEx); if (!success) { ErrorHandler("StartServiceCtrlDispatcher",GetLastError()); } } return 0; }