Сервис C++
В сети нашёл пример сервера на C++, сделал его, но почему-то после регистрации он не запускается. Помогите, пожалуйста, найти ошибку. Вот код:
Код:
#include <windows.h>
#include <winsvc.h>
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle;
int addLogMessage(char *a)
{
printf("%s", a);
return 1;
}
void ServiceMain(int argc, char** argv)
{
int error;
int i = 0;
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwServiceSpecificExitCode = 0;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
serviceStatusHandle = RegisterServiceCtrlHandler(TEXT("SampleService"), /*(LPHANDLER_FUNCTION)ControlHandler*/NULL);
if (serviceStatusHandle == (SERVICE_STATUS_HANDLE)0) {
return;
}
// error = InitService();
if (error) {
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWin32ExitCode = -1;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return;
}
serviceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
while (serviceStatus.dwCurrentState == SERVICE_RUNNING)
{
char buffer[255];
sprintf_s(buffer, "%u", i);
int result = addLogMessage(buffer);
if (result) {
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWin32ExitCode = -1;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return;
}
i++;
}
return;
}
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
addLogMessage("Stopped.");
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
addLogMessage("Shutdown.");
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return;
default:
break;
}
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return;
}
int InstallService() {
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if(!hSCManager) {
addLogMessage("Error: Can't open Service Control Manager");
return -1;
}
SC_HANDLE hService = CreateService(
hSCManager,
TEXT("SampleService"),
TEXT("SampleService"),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
TEXT("C:\\Service\\"),
NULL, NULL, NULL, NULL, NULL
);
if(!hService) {
int err = GetLastError();
switch(err) {
case ERROR_ACCESS_DENIED:
addLogMessage("Error: ERROR_ACCESS_DENIED");
break;
case ERROR_CIRCULAR_DEPENDENCY:
addLogMessage("Error: ERROR_CIRCULAR_DEPENDENCY");
break;
case ERROR_DUPLICATE_SERVICE_NAME:
addLogMessage("Error: ERROR_DUPLICATE_SERVICE_NAME");
break;
case ERROR_INVALID_HANDLE:
addLogMessage("Error: ERROR_INVALID_HANDLE");
break;
case ERROR_INVALID_NAME:
addLogMessage("Error: ERROR_INVALID_NAME");
break;
case ERROR_INVALID_PARAMETER:
addLogMessage("Error: ERROR_INVALID_PARAMETER");
break;
case ERROR_INVALID_SERVICE_ACCOUNT:
addLogMessage("Error: ERROR_INVALID_SERVICE_ACCOUNT");
break;
case ERROR_SERVICE_EXISTS:
addLogMessage("Error: ERROR_SERVICE_EXISTS");
break;
default:
addLogMessage("Error: Undefined");
}
CloseServiceHandle(hSCManager);
return -1;
}
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
addLogMessage("Success install service!");
return 0;
}
int RemoveService() {
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCManager) {
addLogMessage("Error: Can't open Service Control Manager");
return -1;
}
SC_HANDLE hService = OpenService(hSCManager, TEXT("SampleService"), SERVICE_STOP | DELETE);
if(!hService) {
addLogMessage("Error: Can't remove service");
CloseServiceHandle(hSCManager);
return -1;
}
DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
addLogMessage("Success remove service!");
return 0;
}
int StartService() {
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
SC_HANDLE hService = OpenService(hSCManager, TEXT("SampleService"), SERVICE_START);
if(!StartService(hService, 0, NULL)) {
CloseServiceHandle(hSCManager);
addLogMessage("Error: Can't start service");
return -1;
}
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char * servicePath = "C:\\Service\\";
if(argc - 1 == 0) {
SERVICE_TABLE_ENTRY ServiceTable[1];
ServiceTable[0].lpServiceName = TEXT("SampleService");
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
if(!StartServiceCtrlDispatcher(ServiceTable)) {
addLogMessage("Error: StartServiceCtrlDispatcher");
}
} else if( wcscmp(argv[argc-1], _T("install")) == 0) {
InstallService();
} else if( wcscmp(argv[argc-1], _T("remove")) == 0) {
RemoveService();
} else if( wcscmp(argv[argc-1], _T("start")) == 0 ){
StartService();
}
return 0;
}
#include <winsvc.h>
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle;
int addLogMessage(char *a)
{
printf("%s", a);
return 1;
}
void ServiceMain(int argc, char** argv)
{
int error;
int i = 0;
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwServiceSpecificExitCode = 0;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
serviceStatusHandle = RegisterServiceCtrlHandler(TEXT("SampleService"), /*(LPHANDLER_FUNCTION)ControlHandler*/NULL);
if (serviceStatusHandle == (SERVICE_STATUS_HANDLE)0) {
return;
}
// error = InitService();
if (error) {
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWin32ExitCode = -1;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return;
}
serviceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
while (serviceStatus.dwCurrentState == SERVICE_RUNNING)
{
char buffer[255];
sprintf_s(buffer, "%u", i);
int result = addLogMessage(buffer);
if (result) {
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwWin32ExitCode = -1;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
return;
}
i++;
}
return;
}
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
addLogMessage("Stopped.");
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
addLogMessage("Shutdown.");
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return;
default:
break;
}
SetServiceStatus (serviceStatusHandle, &serviceStatus);
return;
}
int InstallService() {
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if(!hSCManager) {
addLogMessage("Error: Can't open Service Control Manager");
return -1;
}
SC_HANDLE hService = CreateService(
hSCManager,
TEXT("SampleService"),
TEXT("SampleService"),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
TEXT("C:\\Service\\"),
NULL, NULL, NULL, NULL, NULL
);
if(!hService) {
int err = GetLastError();
switch(err) {
case ERROR_ACCESS_DENIED:
addLogMessage("Error: ERROR_ACCESS_DENIED");
break;
case ERROR_CIRCULAR_DEPENDENCY:
addLogMessage("Error: ERROR_CIRCULAR_DEPENDENCY");
break;
case ERROR_DUPLICATE_SERVICE_NAME:
addLogMessage("Error: ERROR_DUPLICATE_SERVICE_NAME");
break;
case ERROR_INVALID_HANDLE:
addLogMessage("Error: ERROR_INVALID_HANDLE");
break;
case ERROR_INVALID_NAME:
addLogMessage("Error: ERROR_INVALID_NAME");
break;
case ERROR_INVALID_PARAMETER:
addLogMessage("Error: ERROR_INVALID_PARAMETER");
break;
case ERROR_INVALID_SERVICE_ACCOUNT:
addLogMessage("Error: ERROR_INVALID_SERVICE_ACCOUNT");
break;
case ERROR_SERVICE_EXISTS:
addLogMessage("Error: ERROR_SERVICE_EXISTS");
break;
default:
addLogMessage("Error: Undefined");
}
CloseServiceHandle(hSCManager);
return -1;
}
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
addLogMessage("Success install service!");
return 0;
}
int RemoveService() {
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCManager) {
addLogMessage("Error: Can't open Service Control Manager");
return -1;
}
SC_HANDLE hService = OpenService(hSCManager, TEXT("SampleService"), SERVICE_STOP | DELETE);
if(!hService) {
addLogMessage("Error: Can't remove service");
CloseServiceHandle(hSCManager);
return -1;
}
DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
addLogMessage("Success remove service!");
return 0;
}
int StartService() {
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
SC_HANDLE hService = OpenService(hSCManager, TEXT("SampleService"), SERVICE_START);
if(!StartService(hService, 0, NULL)) {
CloseServiceHandle(hSCManager);
addLogMessage("Error: Can't start service");
return -1;
}
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char * servicePath = "C:\\Service\\";
if(argc - 1 == 0) {
SERVICE_TABLE_ENTRY ServiceTable[1];
ServiceTable[0].lpServiceName = TEXT("SampleService");
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
if(!StartServiceCtrlDispatcher(ServiceTable)) {
addLogMessage("Error: StartServiceCtrlDispatcher");
}
} else if( wcscmp(argv[argc-1], _T("install")) == 0) {
InstallService();
} else if( wcscmp(argv[argc-1], _T("remove")) == 0) {
RemoveService();
} else if( wcscmp(argv[argc-1], _T("start")) == 0 ){
StartService();
}
return 0;
}
Я не очень разбираюсь в отладке, тем более не могу послать значение в argv (через отладчик)(.
Цитата: 1_2
Я не очень разбираюсь в отладке, тем более не могу послать значение в argv (через отладчик)(.
ну значит, придется начать в этом разбираться. Самое время. Потому как за тебя этого никто делать не будет.
И кстати, какие ошибки в журналах Win?
Везде где есть проверка на валидность или отрицательный результат получи код функцией GetLastError далеее для получения описания ошибки передай код функции FormatMessage.
Цитата: xAtom
Везде где есть проверка на валидность или отрицательный результат получи код функцией GetLastError далеее для получения описания ошибки передай код функции FormatMessage.
ну у него вообщето практически все ошибки и без того обрабатываются - для этого достаточно посмотреть код.
Практически все проблемы должны быть видны в журналах системы.
В системном журнале (eventvwr.msc) по поводу сервиса почему-то нет никаких отметок.
Это что получается... не хватает прав? И как тогда запустить от имени обычного пользователя?
И так запускается от обычного. Чтобы установить, необходимо запускать студию от администратора. Но не гарантирую, что что-то будет работать. Код кривой.