Об сервисах
написал сервис но тут у меня возник вопрос
Можно ли запуситить к примеру cmd.exe из сервиса если можно то как через winexec не проходит
Используя стаью(http://www.codenet.ru/progr/visualc/services.php)
написал сервис но тут у меня возник вопрос
Можно ли запуситить к примеру cmd.exe из сервиса если можно то как через winexec не проходит
Можно через WinExec, но сервис должен иметь тип SERVICE_INTERACTIVE_PROCESS. Или установить этот тип при регистрации или в service.msc
так где же менять в проге што сервис рееструёт или в самом сервисе (поминял визде на SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS не канаёт)
Я проверил WinExec("cmd.exe",SW_SHOW) в сервисе, который был зарегистрирован с этими же параметрами. Cmd.exe запускается без проблем.
Перед WinExec поставь MessageBox(0,"Hi","",0);
может управление не доходит до той команды.
Я проверил WinExec("cmd.exe",SW_SHOW) в сервисе, который был зарегистрирован с этими же параметрами. Cmd.exe запускается без проблем.
Перед WinExec поставь MessageBox(0,"Hi","",0);
может управление не доходит до той команды.
У меня тоже пошло большоё тебе списибо.;)
Реально ли две ёти проги в одну стулить как думаёш ???
У меня тоже пошло большоё тебе списибо.;)
Реально ли две ёти проги в одну стулить как думаёш ???
cmd.exe и твой сервис?
Если он должен запускаться, стандартно каждый раз при запуске сервиса, то нужно его поместить в начало главной программы сервиса.
Если нужно, чтоб он запускался по какому-то событию, то нужно создать при запуске сервиса событие, типа hEvent, и один thread, для реакции на это событие:
DWORD WINAPI myFunc(LPVOID)
{
while(bRun==TRUE)
{
WaitForSingleObject(hEvent, INFINITE);
if(bRun==TRUE)WinExec("cmd.exe",SW_SHOW);
ResetEvent(hEvent);
}
return 0;
}
ёще вопрос может есть функцыя котороя из строки типа:
"D:\\Program Files\\Dev-Cpp\\Projects\\first\\SampleService.exe"
оставит ток "SampleService" задолбалса уже вилосипеды выдумывать
и как можно красиво вместо "\" поставить везде "\\"
Для регистрации сервиса нужно запустить программу с ключем /register. Чтоб убрать сервис нужно запустить с ключем /unregister.
SampleService: PathRemoveExtension()+PathStripPath()
\ -> \\ CString имеет операцию Replace.
Я не использую Cstring(да и mfc) :)
Вместо CString можно использовать string(STL)
На яз. С
{
char buf[MAX_PATH+1];
char *dst = buf;
char *src = str;
for(;; )
{
char c = *src++;
*dst++ = c;
if(c==0)break;
if(c==92)*dst++ = 92;
}
strcpy(str, buf);
// пот.баг, если длина dst, больше, чем выделено под str.
}
SampleService почти аналогично,
1. нужно идти с конца строки до первого \
2. мимоходом запомнить положение точки, если такой имеется(или конец строки) и через strncpy.
И как програмно задать "Start parametrs" сервиса??
вот ищё проблема:
И как програмно задать "Start parametrs" сервиса??
Изменить lpBinaryPathName с помощью ChangeServiceConfig. Дописать параметры после пути и exe модуля.
Изменить lpBinaryPathName с помощью ChangeServiceConfig. Дописать параметры после пути и exe модуля.
Я так и делал но оно компилица но потом бинариратсннаме изменяєтса но старт параметры =""
а просто через путь к сервису неполучетса ?
Если имеешь в виду Path to executable, то мы говорим об одном и том же.
Можно бы поменять его значение и через registry, только не знаю msc всегда ли заметит эти изменения.
Часто меняющиесся параметры для сервиса можно задать и через registry.
Но если сервис запускается программно, а не посредством msc, то аргументы можно задать и в ф-ии StartService().
Ага через StartService() вроде можно но чьот не канаёт у меня не могу никак разбратса чьо туда передавать (пробую аргв не канает)???
0-й аргумент, это указатель имя сервися.
Ток опять же програмно останавливать нехочет сервис может я чьо не так пишу вот моя ф-я
void StopService(char* Name,char* DisplayName, SC_HANDLE schSCManager)
{ SERVICE_STATUS ss;
SERVICE_STATUS_HANDLE ssHandle;
SetServiceStatus (ssHandle, &ss);
LPCTSTR lpszName=Name;
LPCTSTR lpszDisplayName=DisplayName;
SC_HANDLE schService = OpenService(
schSCManager, // áàçà äàííûõ SCManager
lpszName, // èìÿ ñåðâèñà
DELETE); // íóæíî òîëüêî
if (schService == NULL)
MyErrorExit("OpenService");
else
{
if(!ControlService(schSCManager, SERVICE_CONTROL_STOP, &ss))
MessageBox(NULL, "Can't stop service", "Error",
MB_OK | MB_ICONERROR);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
}
кажысь нужно както сс заполнять не так но как я незнаю
{
SERVICE_STATUS ss;
SERVICE_STATUS_HANDLE ssHandle;
//SetServiceStatus (ssHandle, &ss); ???
LPCTSTR lpszName=Name;
LPCTSTR lpszDisplayName=DisplayName;
SC_HANDLE schService = OpenService(
schSCManager,
lpszName,
SERVICE_STOP);
if (schService == NULL)
MyErrorExit("OpenService");
else
{
if(!ControlService(schSCManager, SERVICE_CONTROL_STOP, &ss))
MessageBox(NULL, "Can't stop service", "Error", MB_OK | MB_ICONERROR);
CloseServiceHandle(schService);
}
}
В СtrlHandler() сервиса можно бы поставить один MessageBox, чтоб увидеть, получает ли сервис сообщение.
При создании сервиса можно задать параметры, дописав их в конец lpBinaryPathName, но тогда маловероятно, что можно будет менять их значение через StartService.
The specified handle was not obtained using CreateService or OpenService, or the handle is no longer valid.
В StopService GetLastError всегда возращает
The specified handle was not obtained using CreateService or OpenService, or the handle is no longer valid.
schSCManager - это то что надо? Т.е. содержит scm handle?
Но есть шанс на то, что сервис не зарегистрирован
schSCManager - это то что надо? Т.е. содержит scm handle?
Но есть шанс на то, что сервис не зарегистрирован
А ты вообще-то, что хочешь остановить? Свой сервис или scm? Нужно
...
if(!ControlService(schService, SERVICE_CONTROL_STOP, &ss))
...