Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Sobre la función StartService y sus parámetros

Hola,

Existe en la unidad "WinSvc" una función de nombre "StartService". De la documentación en la ayuda de Win32:

Código:
BOOL StartService(
    SC_HANDLE hService,    // handle of service 
    DWORD dwNumServiceArgs,    // number of arguments 
    LPCTSTR *lpServiceArgVectors     // address of array of argument string pointers  
   );
Es el caso que el segundo y tercer parámetros son opciones, puesto que acaso el Servicio a iniciar no los requiere. En este caso "dwNumServiceArgs" ha de valer "0" y "lpServiceArgVectors" ser "nulo". En Delphi el asunto quedaría de este modo, pues:

Código Delphi [-]
begin
   {...}
   StartService(hService, 0, nil);
end;

Ahora bien, suponiendo que un determinado Servicio requiera de algún parámetro... ¿cómo se los haríamos llegar? O sea, no entiendo cómo trabajar con el parámetro de tipo "lpServiceArgVectors" en la función "StartService".

Entiendo que es un "puntero" lo que hay que pasar a la función, y de hecho podemos hacer algo así:

Código Delphi [-]
var
  {...}
  args: PChar;
begin
    {...}
   args := 'unparametro';
    StartService(hService, 0, args);
 end;

O como mucho se me ocurre esto:

Código Delphi [-]
var
  {...}
  args: PChar;
begin
    {...}
   args := 'unparametro';
    StartService(hService, 1, args);
 end;

Que acaso sea algo más acercado que lo anterior, porque al menos aquí indicamos que se le envía un parámetro al Servicio... pero, haciendo esto no podemos enviar más de un parámetro al Servicio (si es que funciona siquiera el que intentamos enviar, porque aunque "compila" no he podido probarlo de veras), y además de no poder enviar más parámetros en realidad es que estamos obviando el tipo "lpServiceArgVectors"...

¿Qué se os ocurre? ¿Alguien utilizó alguna vez el tipo "lpServiceArgVectors"? Disculpad el royo... se ve que la síntesis (de cualquier tipo) no es lo mío... ¡y gracias de antemano pataliebres!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
El argumento lpServiceArgVectors no es mas que un array de PChar. Así que no tenemos mas que declarar un array y pasarlo como parámetro. Para esto supongo que podremos declarar un array fijo, uno dinámico, o por las malas utilizando punteros

Esta es la función que aparece en los trucos, pero modificada para admitir parámetros:
Código Delphi [-]
procedure StartSrv(Nombre: String; Params: TStringList);
var
 ServiceControlManager: SC_HANDLE;
 Service: SC_HANDLE;
 ServiceStatus: SERVICE_STATUS;
 Argv, P: ^PChar;
 i: integer;
begin
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if ServiceControlManager <> 0 then
  begin
    Service:= OpenService(ServiceControlManager,PChar(Nombre),
      SERVICE_QUERY_STATUS or SERVICE_START);
    if Service <> 0 then
    begin
      if QueryServiceStatus(Service, ServiceStatus) then
      begin
        if ServiceStatus.dwCurrentState <> SERVICE_RUNNING  then
        begin
          if (Params <> nil) and (Params.Count > 0) then
          begin
            GetMem(Argv,Params.Count * Sizeof(PChar));
            try
              P:= Argv;
              for i:= 0 to Params.Count - 1 do
              begin
                P^:= PChar(Params[i]);
                inc(P);
              end;
              StartService(Service,Params.Count,Argv^);
            finally
              FreeMem(Argv);
            end;
          end else
          begin
            Argv:= nil;
            StartService(Service,0,Argv^);
          end;
        end;
      end;
      CloseServiceHandle(Service);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;

// Por ejemplo
var
  Params: TStringList;
begin
  Params:= TStringList.Create;
  try
    Params.Add('Uno');
    Params.Add('Dos');
    Params.Add('Tres');
    StartSrv('Service1',Params);
  finally
    Params.Free;
  end;
end;

Ahora si alguien se anima, que lo implemente con arrays dinámicos

Última edición por seoane fecha: 01-02-2007 a las 17:24:13.
Responder Con Cita
  #3  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Flipante. Sin palabras. Muchas gracias Seoane.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Seoane, seguro que estoy haciendo algo mal, porque en la línea:

Código Delphi [-]
P^:= PChar(Params[i]);

Me "dice" el compilador que no son compatibles ambos tipos...

Por otro lado, ¿esto otro funcionaría? Porque compilar compila y un Servicio sin argumentos lo inicia bien, pero, no he probado si funcionaría como se espera en un Servicio con parámetros...

Código Delphi [-]
{...}

var
  argsv := array of PChar;
  FArgumentos: TStringList;  

{...}

if (FArgumentos.Count > 0) then begin
  SetLength(argsv, FArgumentos.Count);
  for i := 0 to FArgumentos.Count-1 do
    argsv[i] := PChar(FArgumentos[i]);
  end;
  StartService(hServicio, FArgumentos.Count, PChar(argsv));
end;

¿O es una burrada?

EDITO: Je, je, je... bueno... no puedo probarlo "realmente", pero, sí puedo incluir un par de parámetros "a ver qué pasa"... y lo que pasa es que empiezan a salir ventanas de error a diestro y siniestro... una detrás de otra y sin parar... "Access violation"...
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 01-02-2007 a las 17:59:24.
Responder Con Cita
  #5  
Antiguo 01-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Prueba algo así:

Código Delphi [-]
  // El array de PChar y el puntero que lo apunta
  type
    PStrArray = ^TStrArray;
    TStrArray = array[0..2] of PChar;

La variable para el parámetro

Código Delphi [-]
var
  lpServiceArgVectors: PChar;

Rellenar los parámetros, la llamada y liberar

Código Delphi [-]
  // proteccion para liberar
  try
    // Supongamos 3 parametros
    GetMem(lpServiceArgVectors, SizeOf(PChar)* 3);
    PStrArray(lpServiceArgVectors)^[0] := PChar('Lunes');
    PStrArray(lpServiceArgVectors)^[1] := PChar('Martes');
    PStrArray(lpServiceArgVectors)^[2] := PChar('Miercoles');
    // Arrancar el servicio
    StartService({Handle}123456, 3, lpServiceArgVectors);
  finally
    FreeMem(lpServiceArgVectors);
  end;

Un saludo.

EDITO: Tarde, tarde, tarde,... pasé tres horas con el mensaje abierto y ya veo que lo tenéis encarrilado...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vale... error mío... el código que pusiste es correcto Seoane, compila perfectamente, lo que ocurre es que estaba declarando las variables tal que así:

Código Delphi [-]
var
  argv, p: PChar;

Cuando tú lo indicaste correctamente:

Código Delphi [-]
var
  argv, p: ^PChar;

Todo correcto, pues. No puedo probar que funcionan los parámetros realmente, pero, sí puedo pasar parámetros "a ver qué pasa" sin que ahora se caiga el programa... ¡gracias otra vez, pues!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Neftali, ¿no se puede declarar lpServiceArgVectors como PStrArray en lugar de PChar para evitar el moldeo en cada asignación y hacerlo sólo al pasarlo a la función?

// Saludos
Responder Con Cita
  #8  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por dec
No puedo probar que funcionan los parámetros realmente
Teniendo un delphi a mano no hay nada que no se pueda hacer Crea un proyecto nuevo un "Service Application" y en el evento OnExecute coloca esto:
Código Delphi [-]
procedure TService2.ServiceExecute(Sender: TService);
var
  i: integer;
begin
  for i:= 1 to Self.ParamCount - 1 do
    OutputDebugString(PChar(Self.Param[i]));
end;

Compila e instala el servicio. Ahora te preguntaras como puedes ver el resultado, para eso utiliza este programa de Mark Russinovich. Cuando ejecutes el servicio, en el DebugView aparecerán los parámetros con que lo has iniciado.
Responder Con Cita
  #9  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
Neftali, ¿no se puede declarar lpServiceArgVectors como PStrArray en lugar de PChar para evitar el moldeo en cada asignación y hacerlo sólo al pasarlo a la función?
¡Abuela! ¡Que es Seoane no Neftalí!

Je, je, je... pero, fuera de bromas... tal vez lo que digas queda más curioso... si bien es cierto que a mí al menos me lo tendrías que traducir un poquitín por lo menos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #10  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Seoane
Teniendo un delphi a mano no hay nada que no se pueda hacer (...)
¡Y que lo tú lo digas! No; pero, no sé... es que creo que le estoy dando demasiadas vueltas al asunto... incluso diría que ya está bien, que esto de los parámetros es lo último que me preocupa de lo que traigo entre manos: una sencilla clase (de las tantas y tantas que hay, mucho mejores) que se encargue de controlar un Servicio: desde su instalación, puesta en marcha, detención, etc.

Pero, como digo, ya está bien, leñe, que a lo mejor no es para tanto... de hecho todo empezó para un programilla que uso personalmente para controlar los Servicios de Apache y MySQL.

PD. Adjunto la clase (o lo que sea), aunque no la considere terminada (ni lo estará nunca) y acaso en lugar de "TServicio" debería llamarse "TServicioWin32" o algo así... como poco.
Archivos Adjuntos
Tipo de Archivo: zip UServicio.zip (3,5 KB, 31 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 02-02-2007 a las 15:46:07.
Responder Con Cita
  #11  
Antiguo 01-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por dec
Pero, como digo, ya está bien, leñe, que a lo mejor no es para tanto...
De eso nada, el tema de los servicios, al menos a mi, me interesa bastante. Así que cualquier cosa que quieras hablar sobre el tema, por mi estupendo

No hace mucho que estoy por este club, pero veo que no es un tema que se toque mucho. Y se me ocurren muchas cosas de que hablar: el control de un servicio en una maquina remota, la comunicación de un servicio con una aplicación de usuario, interactuar con el usuario actual, es decir con su desktop, teniendo en cuenta que los servicios interactivos se acabaron con el nuevo Vista, etc ... Si señor, hay mucho de que hablar sobre el tema.
Responder Con Cita
  #12  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No, si eso es lo malo, precisamente, que habría que dedicarle a ello un tiempo considerable, además de un esfuerzo, una voluntad y demás... pero soy perfectamente consciente de ello. Bueno. Un poco. Cuando dije que no era para tanto me estaba refiriendo a mis necesidades únicamente.

Es decir, en el Monitor de los Servicios de Apache y MySQL que programé para mi uso precisaba de una serie de funciones típicas para controlar un determinado Servicio. Me dio fuerte y conseguí escribir siguiendo la ayuda y no pocos ejemplos las funciones que necesitaba.

Hace poco he retomado el Monitor de marras y he tratado de mejorarlo en algunos aspectos. Y lo he conseguido... pero ya empieza a ser demás, es decir, por ejemplo, la clase "TServicio" hace ya mucho más (independientemente ahora de si lo hace mejor o peor) de lo que necesita el programa Monitor.

Y como por otro lado no es algo que me apasione (como a ti, que me parece estupendo) el tema de los Servicios.... pues por eso decía que no era para tanto, pero no porque el tema de los Servicios no de para mucho... todo lo contrario.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 01-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman
Neftali, ¿no se puede declarar lpServiceArgVectors como PStrArray en lugar de PChar para evitar el moldeo en cada asignación y hacerlo sólo al pasarlo a la función?
Supongo que sí (la verdad es que está así por comodidad, realmente no es lo más eficiente), y luego hacer la llamada como PChar.
No lo he probado, pero debe funcionar ¿no?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 01-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por seoane
..utiliza este programa de Mark Russinovich.
Buen programa...
(SysInternals, como no... )
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 01-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
¡Abuela! ¡Que es Seoane no Neftalí!
La pregunta sí era para Neftali.

// Saludos
Responder Con Cita
  #16  
Antiguo 01-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues me equivoqué entonces. Aunque es un poco raro, ¿no?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #17  
Antiguo 02-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por dec
Aunque es un poco raro, ¿no?
Yo estoy igual que Román. No entiendo. ¿Donde está lo raro?

Alguien aquí se ha despistado...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #18  
Antiguo 02-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

El raro soy yo... es decir, que soy el despistado. No había tu mensaje Neftalí, y de ahí mi confusión. Lo que ya roza lo absurdo es que hize por mirarlo... es decir, cuando repliqué a Román como lo hize fue, precisamente, porque había "revisado" el Hilo y no ví tu mensaje y entendí que Román se había confundido.

Edito: Además de despistado no quiero ser maleducado: os pido disculpas a ambos Román y Neftalí.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 02-02-2007 a las 12:24:01.
Responder Con Cita
  #19  
Antiguo 02-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No te preocupes, supuse que era algo por el estilo pero ayer cuando lo ví ya no tuve tiempo de responder.

// Saludos
Responder Con Cita
  #20  
Antiguo 01-03-2008
fide fide is offline
Miembro
 
Registrado: oct 2006
Posts: 331
Poder: 18
fide Va por buen camino
Lightbulb Clase marabillosa

Cita:
Empezado por dec Ver Mensaje
Hola,



¡Y que lo tú lo digas! No; pero, no sé... es que creo que le estoy dando demasiadas vueltas al asunto... incluso diría que ya está bien, que esto de los parámetros es lo último que me preocupa de lo que traigo entre manos: una sencilla clase (de las tantas y tantas que hay, mucho mejores) que se encargue de controlar un Servicio: desde su instalación, puesta en marcha, detención, etc.

Pero, como digo, ya está bien, leñe, que a lo mejor no es para tanto... de hecho todo empezó para un programilla que uso personalmente para controlar los Servicios de Apache y MySQL.

PD. Adjunto la clase (o lo que sea), aunque no la considere terminada (ni lo estará nunca) y acaso en lugar de "TServicio" debería llamarse "TServicioWin32" o algo así... como poco.
Dec, a la verdad que no se por que razon dices que esa clase no esta terminada, por que por lo que veo, hace todo lo que tiene que hacer y sobre todo de la manera correcta. Es algo bueno de verdad para el trabajo con los dichosos servicios esos. A mi me ha servido para lo que quiero perfectamente...

Gracias.....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Parametros Opcionales no Parametros por defecto Velia Varios 7 19-08-2006 15:18:42
Parámetros en ADO Delfin Conexión con bases de datos 0 19-03-2005 00:02:36
parametros rebollo75 SQL 3 23-11-2004 19:44:59
Parametros jostrix Varios 1 31-10-2004 11:55:33
Parametros BDE Red_Delphi Conexión con bases de datos 0 13-10-2003 10:18:05


La franja horaria es GMT +2. Ahora son las 22:50:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi