Запуск системного процесса (сервиса) Windows

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Запуск системного процесса (сервиса) Windows

Сообщение kinrew » 18.02.2006 (Сб) 21:17

Расскажите, пожалуйста, как из Visual Basic запустить системный процесс?
Т.е. при установке стороннего программного обеспечения создался процесс, который запускается при каждом запуске Windows и отвечает за приём и хранение файлов этого стороннего программного обеспечения, а когда нужно поработать с хранилищем этого ПО, службу нужно останавлисать, после работы запускать, вот с этим и проблема.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.02.2006 (Вс) 6:29

OpenSCManager
OpenService (SERVICE_PAUSE_CONTINUE)
ControlService (SERVICE_CONTROL_PAUSE)
QueryServiceStatus в цикле пока не SERVICE_PAUSED
работа с хранилищем
ControlService (SERVICE_CONTROL_CONTINUE)
CloseServiceHandle (hService)
CloseServiceHandle (hManager)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 19.02.2006 (Вс) 10:13

А какой контрол нужно подключать (Visual Basic 6), потому что если просто ввести этот код, то говорит, что процедура sub не определена и выделяет OpenSCManager?

А где нужно вводить имя сервиса, вместо слова service?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.02.2006 (Вс) 10:21

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 11.03.2006 (Сб) 19:43

Вроде разобрался, только не могу понять, где указывать название того сервиса, который нужно останавливать и не смог найти, что такое hServise и hManager, но понимаю, что это какие-то параметры.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.03.2006 (Сб) 20:13

Есть простой (как для новичка) вариант. Создаешь батник, в котором пишешь:
Код: Выделить всё
net start service_name

где service_name -- имя твоего сервиса.
В VB:
Код: Выделить всё
Shell "C:\start.bat", vbHide

Аналогично для остановки сервиса, только в батнике пишешь:
Код: Выделить всё
net stop service_name
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 11.03.2006 (Сб) 20:26

За решение спасибо! Но всё-таки интересно, как это в VB сразу написать. Тем более набор операторов понятен, но не ясно только где указывать название процесса и что такое hService и hManager

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.03.2006 (Сб) 20:55

hService это то, что возвращает Instal\CreateService
hManager это то, что возвращает OpenSCManager
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 11.03.2006 (Сб) 21:20

Мне нужно останавливать pdmwService.exe (сервис сторонней программы), который есть в разделе "Службы" Windows'a (только называется по-русски) и запускается при старте системы.

Хочу написать всё на Visual Basic'е, т.к. носить с собой помимо программы bat'ник неудобно и, если есть метод написания этого на Visual Basic, то лучше на нём. Непонятно 3 вещи:
1)Если я напишу такой текст:
OpenSCManager
OpenService (SERVICE_PAUSE_CONTINUE)
ControlService (SERVICE_CONTROL_PAUSE)
QueryServiceStatus в цикле пока не SERVICE_PAUSED
работа с хранилищем
ControlService (SERVICE_CONTROL_CONTINUE)
CloseServiceHandle (hService)
CloseServiceHandle (hManager)

то где указать сервис, который нужно остановить?
Описание всех этих API функций для VB я взял из API Text Viewer.
2)
hService это то, что возвращает Instal\CreateService
hManager это то, что возвращает OpenSCManager

что значит Instal\CreateService?
3)Исходя из 2-го текст нужно менять? Что-то вроде:
Код: Выделить всё
hManager = OpenSCManager

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2006 (Вс) 6:04

kinrew
Приведённый список есть перечень функций в порядке вызова с указанием отдельных параметров.
Использовать его как готовый код, мягко говоря, странно.
Ты был там, куда я тебя послал?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 12.03.2006 (Вс) 11:16

что значит Instal\CreateService

Сорри. Имелось ввиду OpenService.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 15.03.2006 (Ср) 1:52

Написал такой код:
Код: Выделить всё
Dim hManager As Long
  Dim hService As Long
  Dim tmp1 As Long
  Dim tmp2 As Long
  Dim tmp3 As SERVICE_STATUS
 
  Public Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
Public Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
Public Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long
Public Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, lpServiceStatus As SERVICE_STATUS) As Long
Public Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long


Public Type SERVICE_STATUS
        dwServiceType As Long
        dwCurrentState As Long
        dwControlsAccepted As Long
        dwWin32ExitCode As Long
        dwServiceSpecificExitCode As Long
        dwCheckPoint As Long
        dwWaitHint As Long
End Type

Public Const SERVICE_ACCEPT_PAUSE_CONTINUE = &H2
Public Const SERVICE_ACCEPT_SHUTDOWN = &H4
Public Const SERVICE_ACCEPT_STOP = &H1
Public Const SERVICE_ACTIVE = &H1
Public Const SERVICE_CHANGE_CONFIG = &H2
Public Const SERVICE_CONTINUE_PENDING = &H5
Public Const SERVICE_CONTROL_CONTINUE = &H3
Public Const SERVICE_CONTROL_INTERROGATE = &H4
Public Const SERVICE_CONTROL_PAUSE = &H2
Public Const SERVICE_CONTROL_SHUTDOWN = &H5
Public Const SERVICE_CONTROL_STOP = &H1
Public Const SERVICE_ENUMERATE_DEPENDENTS = &H8
Public Const SERVICE_INACTIVE = &H2
Public Const SERVICE_INTERROGATE = &H80
Public Const SERVICE_NO_CHANGE = &HFFFF
Public Const SERVICE_PAUSE_CONTINUE = &H40
Public Const SERVICE_PAUSE_PENDING = &H6
Public Const SERVICE_PAUSED = &H7
Public Const SERVICE_QUERY_CONFIG = &H1
Public Const SERVICE_QUERY_STATUS = &H4
Public Const SERVICE_RUNNING = &H4
Public Const SERVICE_START = &H10
Public Const SERVICE_START_PENDING = &H2
Public Const SERVICE_STATE_ALL = (SERVICE_ACTIVE Or SERVICE_INACTIVE)
Public Const SERVICE_STOP = &H20
Public Const SERVICE_STOP_PENDING = &H3
Public Const SERVICE_STOPPED = &H1
Public Const SERVICE_USER_DEFINED_CONTROL = &H100
Public Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SERVICE_QUERY_CONFIG Or SERVICE_CHANGE_CONFIG Or SERVICE_QUERY_STATUS Or SERVICE_ENUMERATE_DEPENDENTS Or SERVICE_START Or SERVICE_STOP Or SERVICE_PAUSE_CONTINUE Or SERVICE_INTERROGATE Or SERVICE_USER_DEFINED_CONTROL)
 
  hManager = OpenSCManager("", "", SERVICE_ALL_ACCESS)
  hService = OpenService(hManager, "InCD Helper", SERVICE_ALL_ACCESS)
  tmp1 = ControlService(hService, SERVICE_CONTROL_STOP, tmp3)
  MsgBox "0"
  'tmp2 = QueryServiceStatus
  'QueryServiceStatus в цикле пока не SERVICE_PAUSED
  'работа с хранилищем
  tmp1 = ControlService(hManager, SERVICE_CONTROL_CONTINUE, tmp3)
  CloseServiceHandle (hService)
  CloseServiceHandle (hManager)

а он не останавливает службу. Что делать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.03.2006 (Ср) 6:47

Как всегда.
Дебажить.
Смотреть, что возвращает каждая функция. И что возвращает err.lastdllerror.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 15.03.2006 (Ср) 22:07

Написал я
Код: Выделить всё
RetVal = Err.LastDllError
MsgBox Err.LastDllError

В результате получил 6. Как можно посмотреть, что это значит?
Но до выполнения операторов работы с сервисом код ошибки такой же, что говорит об отсутствии ошибки в работе с сервисом.

Непонятно только, что нужно писать в
Код: Выделить всё
tmp1 = ControlService(hService, SERVICE_CONTROL_STOP, tmp3)

вместо tmp3, какая это должна быть константа? Или это должна быть просто переменная с типом SERVICE_STATUS?

когда выполняется код ошибок никаких не возникает, только сервис не останавливается :cry:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.03.2006 (Чт) 4:49

kinrew
Вернёмся на шаг назад. К сообщению http://bbs.vbstreets.ru/viewtopic.php?p=6590562#6590562

Если ты там был, всех этих вопросов у тебя быть не должно.
Потому что там для каждой функции написано, что она возвращает в случае ошибки. И написано также, является возвращённое значение сразу кодом ошибки или надо lastdllerror смотреть.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 16.03.2006 (Чт) 8:45

VVitafresh писал(а): Создаешь батник, в котором пишешь:
Код: Выделить всё
net start service_name
...
Код: Выделить всё
Shell "C:\start.bat", vbHide


Что мешает написать:
Код: Выделить всё
Shell "net start service_name", vbHide

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 16.03.2006 (Чт) 10:13

Ничего не мешает. Просто челу интересно разобраться через API (наверное).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 16.03.2006 (Чт) 14:10

Да, именно так! В будущем пригодится.

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 16.03.2006 (Чт) 15:17

Код: Выделить всё
Dim hManager As Long
Dim hService As Long
hManager = OpenSCManager("", SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
hService = OpenService(hManager, "Темы", SERVICE_ALL_ACCESS)


Почему может возникать ошибка 1060 ERROR_SERVICE_DOES_NOT_EXIST после выполнения оператора OpenService, причём если написать
Код: Выделить всё
Shell "net stop ""Темы""", vbHide
то всё нормально и служба останавливается?
Значения hManager = 2058248
hService = 0

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.03.2006 (Чт) 15:42

У службы есть имя, отображаемое имя и описание. Посмотри в свойствах службы. Перечислены одно за одним.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 16.03.2006 (Чт) 16:27

kinrew писал(а):
Код: Выделить всё
Dim hManager As Long
Dim hService As Long
hManager = OpenSCManager("", SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
hService = OpenService(hManager, "Темы", SERVICE_ALL_ACCESS)


Почему может возникать ошибка 1060 ERROR_SERVICE_DOES_NOT_EXIST после выполнения оператора OpenService, причём если написать
Код: Выделить всё
Shell "net stop ""Темы""", vbHide
то всё нормально и служба останавливается?
Значения hManager = 2058248
hService = 0


конвертнуть название?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 16.03.2006 (Чт) 16:48

Нет у каждой службы есть название, отображаемое название и комментарий (всё смотрится в свойствах службы). Например "Themes"-"Темы"-"Управление темами оформления". Просто вместо "Темы" нужно указывать "Themes".

kinrew
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 15.02.2006 (Ср) 18:02
Откуда: Москва

Сообщение kinrew » 16.03.2006 (Чт) 16:50

Получается если служба не поддерживает метод приостановки (SERVICE_CONTROL_PAUSE и в свойствах нет кнопки "Пауза"), тогда про API можно забыть?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.03.2006 (Чт) 18:08

Угу.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 113

    TopList