Добрый день!
Я был вынужден модифицировать программу, работающую как сервис на NT и она перестала нормально останавливаться, когда делаешь это из окна Services вручную. Обнаружил, что команда SetServiceStatus при инициализации (SERVICE_RUNNING) в ServiceMain проходит успешно, а вот когда посылается статус SERVICE_STOPPED, эта команда завершается с GetLastError() = 6 — ERROR_INVALID_HANDLE. Вывел в лог значение хэндла как целое число — после инициализации и в момент останова оно одинаковое. Хэндл, как во всех примерах, определен как глобальная переменная типа SERVICE_STATUS_HANDLE и после инициализации программа к нему не должна обращаться. Я добавил ExitProcess(1) после команды SetServiceStatus со статусом SERVICE_STOPPED, и сервис стал останавливаться с сообщением об ошибке (что-то вроде "..pipe riched end.."). По крайней мере, теперь не надо перезагружать компьютер, когда ставлю новую версию, но удовлетворения нет. Может, кто-нибудь подскажет, в чем дело? Спасибо.
Здравствуйте, mselez, Вы писали:
M>Добрый день! M>Я был вынужден модифицировать программу, работающую как сервис на NT и она перестала нормально останавливаться, когда делаешь это из окна Services вручную. Обнаружил, что команда SetServiceStatus при инициализации (SERVICE_RUNNING) в ServiceMain проходит успешно, а вот когда посылается статус SERVICE_STOPPED, эта команда завершается с GetLastError() = 6 — ERROR_INVALID_HANDLE.
Здравствуйте, mselez, Вы писали:
M>Обнаружил, что команда SetServiceStatus при инициализации (SERVICE_RUNNING) в ServiceMain проходит успешно, а вот когда посылается статус SERVICE_STOPPED, эта команда завершается с GetLastError() = 6 — ERROR_INVALID_HANDLE. Вывел в лог значение хэндла как целое число — после инициализации и в момент останова оно одинаковое.
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, mselez, Вы писали:
M>Обнаружил, что команда SetServiceStatus при инициализации (SERVICE_RUNNING) в ServiceMain проходит успешно, а вот когда посылается статус SERVICE_STOPPED, эта команда завершается с GetLastError() = 6 — ERROR_INVALID_HANDLE. Вывел в лог значение хэндла как целое число — после инициализации и в момент останова оно одинаковое.
SH>Очень странно. Ты его случайно не закрываешь?
Нет, его ведь не надо закрывать. Я обращаюсь к хэндлу только при инициализации и при останове.
Здравствуйте, Clickmaker, Вы писали:
C>Здравствуйте, mselez, Вы писали:
M>Добрый день! M>Я был вынужден модифицировать программу, работающую как сервис на NT и она перестала нормально останавливаться, когда делаешь это из окна Services вручную. Обнаружил, что команда SetServiceStatus при инициализации (SERVICE_RUNNING) в ServiceMain проходит успешно, а вот когда посылается статус SERVICE_STOPPED, эта команда завершается с GetLastError() = 6 — ERROR_INVALID_HANDLE.
C>ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus);
Попробовал ControlService, тот же код ошибки в ответ.
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, mselez, Вы писали:
M>Нет, его ведь не надо закрывать. Я обращаюсь к хэндлу только при инициализации и при останове.
SH>Да я в курсе, что не надо... Но ничего умнее в голову не пришло. И не приходит. Единственное, что могу сказать — так быть не должно.
Ну, и на это спасибо!