Параметры внутри SetServiceStatus - PullRequest
0 голосов
/ 27 января 2020

Я читал приложение-службу Windows на MSDN, где наткнулся на следующий фрагмент кода:

 [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool SetServiceStatus(System.IntPtr handle, ref ServiceStatus serviceStatus);

Я понял, что Servicestatus используется для установки статуса службы в различные точки его жизненного цикла.

Однако я не могу понять, как использовать дескриптор System.IntPtr . Пожалуйста, помогите мне, поскольку я новичок в этом топи c. Спасибо.

1 Ответ

0 голосов
/ 27 января 2020

Если у вас нет конкретной c причины для использования DllImport, я бы предложил использовать уже доступную оболочку ServiceController , найденную в System.ServiceProcess сборка .

Затем, чтобы установить статус службы, просто введите имя службы следующим образом:

ServiceController serviceController = new ServiceController("MyServiceName");
serviceController.Start();
serviceController.Stop();

В идеале, перед запуском или остановкой службы необходимо предварительно проверить состояние. Для этого вы можете использовать следующий метод:

public ServiceControllerStatus GetServiceStatus(string serviceName)
{
    ServiceController[] services = ServiceController.GetServices();
    using (ServiceController service = services.FirstOrDefault(s => s.ServiceName == serviceName))
    {
        if (service != null)
        {
            using (ServiceController sc = new ServiceController(service.ServiceName))
            {
                return sc.Status;
            }
        }
        else
        {
            //Here you can either throw an exception or return default(ServiceControllerStatus).
        }          
    }
}
...