2008-12-26 38 views
6

Tengo un servicio de Windows basado en Deplhi que, en la instalación, analiza algunos argumentos de línea de comandos. Quiero que esos argumentos se agreguen a la línea de comando de servicios (valor de ImagePath en el registro) para que el servicio siempre se inicie con ellos.Argumentos de línea de comandos de Delphi Windows Services

¿Cómo puedo lograr esto?

que desea que el aspecto regedit así:
en la clave de registro HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ MyService

  • ImagePath = C:\Path\to\my\service.exe -some -arguments

Gracias

Actualización: La instalación se realiza con >MyService.exe /install -some -arguments. Esos argumentos son los que quiero persistir en la línea de comando.

Actualización: Encontré una solución escribiendo directamente al registro (vea here), pero me gustaría una solución más elegante, como usar alguna propiedad de TService o algo por el estilo. ¡Gracias!

+0

¿Cómo se realiza la instalación? –

Respuesta

8

Ok, después de algunas investigaciones, abandoné un enfoque elegante, y tomé la senda directa de escribir directamente en el registro.

Para simplificar, hice esto: almaceno los argumentos que quería pasar en variables en mi TService. Luego, configuré el evento AfterInstall para escribir directamente en el registro (utilizando un objeto TRegistry) la línea de comando exacta que quería.

uses Registry; 
procedure MyService.AfterInstall(Sender: TObject) ; 
var 
    reg:TRegistry; 
begin 
    reg := TRegistry.Create; 
    try 
    reg.RootKey := 'HKEY_LOCAL_MACHINE'; 
    if reg.OpenKey('SYSTEM\CurrentControlSet\Services\MyService', True) then 
    begin 
     reg.WriteExtendString ('ImagePath', ParamStr(0) + ' -some -arguments') ; 
     reg.CloseKey; 
    end; 
    finally 
    reg.Free; 
    end; 
end; 

No era la solución elegante que estaba buscando, pero cumple su función.

Gracias por las otras respuestas a través de!

0

No creo que puedas hacer que el servicio comience con ellos, pero si almacenas esos parámetros en el registro puedes modificar el programa para futuros comienzos, siempre ve y atrápalos. (es decir, si ParamCount = 0 luego recupera los parámetros del registro)

+0

Seguramente puede hacer que el servicio comience con estos parámetros. La pregunta es cómo hacer que el instalador los agregue al registro. –

4

Los argumentos del servicio se pueden pasar en el argumento lpBinaryPathName a la función CreateService. En TService de Delphi, esto se llama dentro de TServiceApplication.RegisterServices.InstallService, que no puede anular (fácilmente).

Por lo tanto, sospecho que la forma más fácil de hacer esto será gestionar el evento TService.AfterInstall y actualizar el registro usted mismo a través del ChangeServiceConfig.

0

Pablo, Tuve la misma pregunta y no pude encontrar nada, e hice la ruta de edición del registro también. Además, uso acciones personalizadas también para crear directorios de instalación adicionales y copiar archivos (en C#). Su sugerencia fue útil y también dejé de buscar una forma "elegante". gracias

2

Acabo de descubrir algo poco sorprendente, podría ser digno de compartir.

Puede especificar parámetros para servicios de Windows en (al menos) siguientes maneras:

  1. introducirlo en el GUI de servicio como "Startparameter".
  2. pasarlo como argumentos a: sc.exe YourService param1 param2
  3. entrar en él en el registro de entrada ImagePath = .. \ YourService.exe param1 param2

En Delphi hay 2 maneras de Consulta a una aplicación/parámetros de servicio:

  • System.ParamCount/System.ParamStr: De esta forma se obtienen los parámetros de 3. arriba.
  • TService.ParamCount/TService.Param []: De esta forma se obtienen los parámetros de 1. y 2. anteriores.
+0

1. Funcionará solo cuando inicie el servicio desde el administrador del servicio, no se conserva. –

+0

cierto. Implementé persistiendo los parámetros como se describe en la respuesta aceptada arriba (AfterInstall). Esta respuesta solo fue pensada como información adicional. – nang

2

Debe utilizar la API de SCM para instalar correctamente el servicio y configurarlo. SC.EXE es una interfaz de línea de comando para la API de SCM. No debe manipular el registro directamente en esta situación, funciona, pero también depende de qué permiso tiene la cuenta de servicio. De todos modos, me pregunto por qué necesita argumentos de línea de comandos si los inserta en el código; generalmente esos argumentos se establecen fuera del servicio (por un instalador, configurador, lo que sea) para cambiar el comportamiento del servicio.

+0

Un buen punto sobre el permiso, no tenía eso en cuenta. Sobre mi necesidad, mi servicio no tiene una aplicación de configuración, y la instalación se realiza con/install param (supongo que de esta manera, si tengo permiso para crear la clave reg para el servicio, también tengo permiso para hacerlo manualmente) edite la clave). Es estos params proporcionados que quiero persistir. No recuerdo exactamente por qué ahora, pero creo que es porque quería que el servicio se ejecutara muchas veces con diferentes parámetros. –

+0

"si tengo permiso para crear la clave de registro". Sí, el problema está ahí. Vista/7 puede no permitirlo a menos que la operación se realice con privilegios elevados. El modificador/install es útil para la instalación rápida y sucia del servicio, pero sería mejor ofrecer un procedimiento adecuado de instalación/desinstalación al usuario. Escribí un script para ser utilizado en la herramienta gratuita de configuración InnoSetup para manejar los servicios (http://www.sandon.it/?q=node/9), otros servicios de soporte del instalador de forma nativa. –

Cuestiones relacionadas