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
ERROR_ACCESS_DENIED
El identificador no tiene el derecho de acceso SERVICE_START.
ERROR_INVALID_HANDLE
El identificador no es válido.
ERROR_PATH_NOT_FOUND
No se encontró el archivo binario del servicio.
ERROR_SERVICE_ALREADY_RUNNING
Ya se está ejecutando una instancia del servicio.
ERROR_SERVICE_DATABASE_LOCKED
La base de datos está bloqueada.
ERROR_SERVICE_DEPENDENCY_DELETED
El servicio depende de un servicio que no exista o se haya marcado para su eliminación.
ERROR_SERVICE_DEPENDENCY_FAIL
El servicio depende de otro servicio que no se haya podido iniciar.
ERROR_SERVICE_DISABLED
El servicio se ha deshabilitado.
ERROR_SERVICE_LOGON_FAILED
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".
ERROR_SERVICE_MARKED_FOR_DELETE
El servicio se ha marcado para su eliminación.
ERROR_SERVICE_NO_THREAD
No se pudo crear un subproceso para el servicio.
ERROR_SERVICE_REQUEST_TIMEOUT
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.
El proceso de llamada puede determinar si el nuevo servicio ha finalizado su inicialización llamando a la función QueryServiceStatus periódicamente para consultar el estado del servicio.

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

Consulte también

ControlService

CreateService

DeleteService

OpenService

QueryServiceDynamicInformation

QueryServiceStatusEx

Funciones de servicio

Inicio del servicio

ServiceMain