Compartir a través de


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 de 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 de 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 controladores no reciben estos argumentos.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es distinto de cero.

Si se produce un error en la función, 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. Otros 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 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 iniciado.
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.

Observaciones

Cuando se inicia un servicio de controlador, la función StartService no devuelve hasta que el controlador de 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 una notificación del distribuidor de control de servicio que el ServiceMain subproceso de este servicio se creó correctamente.

El SCM establece los siguientes valores de estado predeterminados antes de devolver de 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.
  • La hora 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. Después de que el servicio informe al SCM que se ha iniciado correctamente, puede llamar a StartService.

Al igual que con ControlService, StartService 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 con ERROR_SERVICE_REQUEST_TIMEOUT. Esto se debe a que el SCM solo procesa una notificación de control de servicio a la vez.

Ejemplos

Para obtener un ejemplo, consulte Iniciar 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 dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Conventions for Function Prototypes.

Requisitos

Requisito Valor
cliente mínimo admitido Windows XP [solo aplicaciones de escritorio]
servidor mínimo admitido Windows Server 2003 [solo aplicaciones de escritorio]
de la plataforma de destino de Windows
encabezado de winsvc.h (incluya Windows.h)
biblioteca de Advapi32.lib
DLL de Advapi32.dll

Consulte también

ControlService

CreateService

DeleteService

OpenService

queryServiceDynamicInformation de

QueryServiceStatusEx

Funciones de servicio

de inicio del servicio

ServiceMain