Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Об сервисах

5.9K
08 февраля 2005 года
0m3r
41 / / 08.02.2005
Используя стаью(http://www.codenet.ru/progr/visualc/services.php)
написал сервис но тут у меня возник вопрос
Можно ли запуситить к примеру cmd.exe из сервиса если можно то как через winexec не проходит
368
08 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
Используя стаью(http://www.codenet.ru/progr/visualc/services.php)
написал сервис но тут у меня возник вопрос
Можно ли запуситить к примеру cmd.exe из сервиса если можно то как через winexec не проходит

Можно через WinExec, но сервис должен иметь тип SERVICE_INTERACTIVE_PROCESS. Или установить этот тип при регистрации или в service.msc

5.9K
08 февраля 2005 года
0m3r
41 / / 08.02.2005
так где же менять в проге што сервис рееструёт или в самом сервисе (поминял визде на SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS не канаёт)
368
08 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
так где же менять в проге што сервис рееструёт или в самом сервисе (поминял визде на SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS не канаёт)


Я проверил WinExec("cmd.exe",SW_SHOW) в сервисе, который был зарегистрирован с этими же параметрами. Cmd.exe запускается без проблем.
Перед WinExec поставь MessageBox(0,"Hi","",0);
может управление не доходит до той команды.

5.9K
08 февраля 2005 года
0m3r
41 / / 08.02.2005
Цитата:
Originally posted by rostyslav

Я проверил WinExec("cmd.exe",SW_SHOW) в сервисе, который был зарегистрирован с этими же параметрами. Cmd.exe запускается без проблем.
Перед WinExec поставь MessageBox(0,"Hi","",0);
может управление не доходит до той команды.


У меня тоже пошло большоё тебе списибо.;)
Реально ли две ёти проги в одну стулить как думаёш ???

368
08 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r

У меня тоже пошло большоё тебе списибо.;)
Реально ли две ёти проги в одну стулить как думаёш ???

cmd.exe и твой сервис?

Если он должен запускаться, стандартно каждый раз при запуске сервиса, то нужно его поместить в начало главной программы сервиса.

Если нужно, чтоб он запускался по какому-то событию, то нужно создать при запуске сервиса событие, типа hEvent, и один thread, для реакции на это событие:

Код:
BOOL bRun = TRUE;

DWORD WINAPI myFunc(LPVOID)
{
  while(bRun==TRUE)
  {
    WaitForSingleObject(hEvent, INFINITE);
    if(bRun==TRUE)WinExec("cmd.exe",SW_SHOW);
    ResetEvent(hEvent);
  }
  return 0;
}
5.9K
09 февраля 2005 года
0m3r
41 / / 08.02.2005
Да нет прогу што добавляет сервис и сам сервис в один бинарник. Всё равно спасибо!!!
ёще вопрос может есть функцыя котороя из строки типа:
"D:\\Program Files\\Dev-Cpp\\Projects\\first\\SampleService.exe"
оставит ток "SampleService" задолбалса уже вилосипеды выдумывать
и как можно красиво вместо "\" поставить везде "\\"
368
09 февраля 2005 года
rostyslav
629 / / 13.07.2004
Конечно, что можно в один. Пример кода http://forum.codenet.ru/attachment.php?postid=83568 .
Для регистрации сервиса нужно запустить программу с ключем /register. Чтоб убрать сервис нужно запустить с ключем /unregister.

SampleService: PathRemoveExtension()+PathStripPath()

\ -> \\ CString имеет операцию Replace.
5.9K
14 февраля 2005 года
0m3r
41 / / 08.02.2005
Я не использую Cstring(да и mfc) :)
368
14 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
Я не использую Cstring(да и mfc) :)

Вместо CString можно использовать string(STL)

На яз. С

Код:
void doubleBS(char *str)
{
  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.
5.9K
01 марта 2005 года
0m3r
41 / / 08.02.2005
вот ищё проблема:
И как програмно задать "Start parametrs" сервиса??
368
01 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
вот ищё проблема:
И как програмно задать "Start parametrs" сервиса??

Изменить lpBinaryPathName с помощью ChangeServiceConfig. Дописать параметры после пути и exe модуля.

5.9K
02 марта 2005 года
0m3r
41 / / 08.02.2005
Цитата:
Originally posted by rostyslav
Изменить lpBinaryPathName с помощью ChangeServiceConfig. Дописать параметры после пути и exe модуля.


Я так и делал но оно компилица но потом бинариратсннаме изменяєтса но старт параметры =""

368
02 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
а просто через путь к сервису неполучетса ?

Если имеешь в виду Path to executable, то мы говорим об одном и том же.
Можно бы поменять его значение и через registry, только не знаю msc всегда ли заметит эти изменения.

Часто меняющиесся параметры для сервиса можно задать и через registry.

Но если сервис запускается программно, а не посредством msc, то аргументы можно задать и в ф-ии StartService().

5.9K
04 марта 2005 года
0m3r
41 / / 08.02.2005
Ага через StartService() вроде можно но чьот не канаёт у меня не могу никак разбратса чьо туда передавать (пробую аргв не канает)???
368
04 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
Ага через StartService() вроде можно но чьот не канаёт у меня не могу никак разбратса чьо туда передавать (пробую аргв не канает)???

0-й аргумент, это указатель имя сервися.

5.9K
04 марта 2005 года
0m3r
41 / / 08.02.2005
Всьо пошло но как параметры задавать при создании сервиса ну да ладно и так неплохо получаетса
Ток опять же програмно останавливать нехочет сервис может я чьо не так пишу вот моя ф-я

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);
}
}
кажысь нужно както сс заполнять не так но как я незнаю
368
04 марта 2005 года
rostyslav
629 / / 13.07.2004
Код:
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,
  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.
5.9K
05 марта 2005 года
0m3r
41 / / 08.02.2005
В StopService GetLastError всегда возращает
The specified handle was not obtained using CreateService or OpenService, or the handle is no longer valid.
368
05 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
В StopService GetLastError всегда возращает
The specified handle was not obtained using CreateService or OpenService, or the handle is no longer valid.

schSCManager - это то что надо? Т.е. содержит scm handle?

Но есть шанс на то, что сервис не зарегистрирован

5.9K
09 марта 2005 года
0m3r
41 / / 08.02.2005
Цитата:
Originally posted by rostyslav
schSCManager - это то что надо? Т.е. содержит scm handle?

Но есть шанс на то, что сервис не зарегистрирован


 
Код:
SC_HANDLE schSCManager=InitBaseSCManager();
368
09 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by 0m3r
 
Код:
SC_HANDLE schSCManager=InitBaseSCManager();

А ты вообще-то, что хочешь остановить? Свой сервис или scm? Нужно
...
if(!ControlService(schService, SERVICE_CONTROL_STOP, &ss))
...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог