Función StartServiceA (winsvc.h)
Inicia un servicio.
Sintaxis
BOOL StartServiceA(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCSTR *lpServiceArgVectors
);
Parámetros
[in] hService
Identificador del servicio. La función OpenService o CreateService devuelve este identificador y debe tener el derecho de acceso SERVICE_START. Para obtener más información, consulte Derechos de acceso y seguridad del servicio.
[in] dwNumServiceArgs
Número de cadenas de la matriz lpServiceArgVectors . Si lpServiceArgVectors es NULL, este parámetro puede ser cero.
[in, optional] lpServiceArgVectors
Las cadenas terminadas en null que se van a pasar a la función ServiceMain para el servicio como argumentos. Si no hay argumentos, este parámetro puede ser NULL. De lo contrario, el primer argumento (lpServiceArgVectors[0]) es el nombre del servicio, seguido de cualquier argumento adicional (lpServiceArgVectors[1] a lpServiceArgVectors[dwNumServiceArgs-1]).
Los servicios de controlador no reciben estos argumentos.
Valor devuelto
Si la función se realiza correctamente, el valor devuelto es distinto de cero.
Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.
El administrador de control de servicios puede establecer los siguientes códigos de error. Otras pueden establecerse mediante las funciones del Registro a las que llama el administrador de control de servicios.
Código devuelto | Descripción |
---|---|
|
El identificador no tiene el derecho de acceso SERVICE_START. |
|
El identificador no es válido. |
|
No se encontró el archivo binario del servicio. |
|
Ya se está ejecutando una instancia del servicio. |
|
La base de datos está bloqueada. |
|
El servicio depende de un servicio que no exista o se haya marcado para su eliminación. |
|
El servicio depende de otro servicio que no se haya podido iniciar. |
|
El servicio se ha deshabilitado. |
|
El servicio no se inició debido a un error de inicio de sesión. Este error se produce si el servicio está configurado para ejecutarse en una cuenta que no tiene el derecho "Iniciar sesión como servicio". |
|
El servicio se ha marcado para su eliminación. |
|
No se pudo crear un subproceso para el servicio. |
|
El proceso para el servicio se inició, pero no llamó a StartServiceCtrlDispatcher o el subproceso que llamó a StartServiceCtrlDispatcher puede bloquearse en una función de controlador de control. |
Comentarios
Cuando se inicia un servicio de controlador, la función StartService no devuelve hasta que el controlador del dispositivo haya terminado de inicializarse.
Cuando se inicia un servicio, Service Control Manager (SCM) genera el proceso de servicio, si es necesario. Si el servicio especificado comparte un proceso con otros servicios, es posible que el proceso necesario ya exista. La función StartService no espera la primera actualización de estado del nuevo servicio, ya que puede tardar un tiempo. En su lugar, devuelve cuando el SCM recibe la notificación del distribuidor de control de servicio de que el subproceso ServiceMain de este servicio se creó correctamente.
El SCM establece los siguientes valores de estado predeterminados antes de devolver desde StartService:
- El estado actual del servicio se establece en SERVICE_START_PENDING.
- Los controles aceptados se establecen en ninguno (cero).
- El valor de CheckPoint se establece en cero.
- El tiempo waitHint se establece en 2 segundos.
Un servicio no puede llamar a StartService durante la inicialización. El motivo es que el SCM bloquea la base de datos de control de servicio durante la inicialización, por lo que se bloqueará una llamada a StartService . Una vez que el servicio informa al SCM de que se ha iniciado correctamente, puede llamar a StartService.
Al igual que con ControlService, StartService se bloqueará durante 30 segundos si algún servicio está ocupado controlando un código de control. Si el servicio ocupado todavía no ha devuelto de su función de controlador cuando expira el tiempo de espera, StartService produce un error en ERROR_SERVICE_REQUEST_TIMEOUT. Esto se debe a que el SCM procesa solo una notificación de control de servicio a la vez.
Ejemplos
Para obtener un ejemplo, consulte Inicio de un servicio.
Nota
El encabezado winsvc.h define StartService como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede provocar discrepancias que dan lugar a errores de compilación o en tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.
Requisitos
Cliente mínimo compatible | Windows XP [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2003 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | winsvc.h (incluye Windows.h) |
Library | Advapi32.lib |
Archivo DLL | Advapi32.dll |