
Crear Servicio de windows
#1
Escrito 07 enero 2009 - 03:45
Tengo otro "detalle" con el programa donde pregunto sobre multihilos.
Resulta que este programa solo puede ser ejecutado cuando se entra a la sesión de windows, sin embargo, necesito que este programa funcione como servicio y que no requiera de que el usuario tenga que iniciar una sesión en la computadora.
He visto algunas publicaciones donde se habla de esto, pero no he podido comprender como es que se hace esto.
Ojala y alguien pudiera orientarme acerca de esto.
Salud OS
#2
Escrito 07 enero 2009 - 03:48
.... commamidora.
...
Esto sigue causandome gracia

#3
Escrito 07 enero 2009 - 03:54
Salud OS
Sorry Cannabis y cHackAll,

#4
Escrito 07 enero 2009 - 03:56
jajajajaa, tendremos que quitar esa palabra del diccionario jajajaja
Salud OS
Sorry Cannabis y cHackAll,
A ver, vamos a probar


Computadora

Amputar

Salud OS
#5
Escrito 07 enero 2009 - 04:53
#6
Escrito 07 enero 2009 - 04:57
mi amor



Después de la amable sugerencia de Jose, se han eliminado esas palabras del diccionario

Salud OS
#7
Escrito 07 enero 2009 - 05:02
puta
![]()
![]()
![]()
Después de la amable sugerencia de Jose, se han eliminado esas palabras del diccionario
Salud OS
xxx"palabra"xxx Ok
" palabra " NO ?
ya estoy divagando!
#8
Escrito 07 enero 2009 - 05:05
xxx"palabra"xxx Ok
" palabra " NO ?
ya estoy divagando!
Intenta de nuevo



Salud OS
#9
Escrito 07 enero 2009 - 07:27
Volviendo al contexto original de este hilo... que haremos con este vicio

te comento ego que tenia un documento sobre como hacer esto, pero no lo encontré


http://www.devarticl...vice-in-Delphi/
#10
Escrito 07 enero 2009 - 07:30
Ya esta marcado en mis tutoriales

Salud OS
#11
Escrito 22 junio 2010 - 01:26
Pues si, resucitando muertos




Bueno, resulta que estoy haciendo un servicio para ejecutar un programa X, el problema es que el ejecutable está listado en el Administrador de Tareas pero no es visible (Les adjunto una imagen), éste es el código que estoy utilizando dentro del servicio.
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin ShellExecute(0,nil,'c:\Windows\NOTEPAD.exe',nil, nil, SW_SHOWNORMAL); end;
Seguramente tengo un problema en los parámetros que estoy utilizando pero no se cual

La otra problemática que tengo es como cerrar ese mismo programa cuando detengo el servicio.
A ver si alguien me puede ayudar con este penoso asunto

Salud OS
Archivos adjuntos
#12
Escrito 22 junio 2010 - 02:20
Una solución es marcar en las propiedades del servicio una opción que dice algo asi "Permitir a los servicios que interactuen con el escritorio", aunque es una opción que no te recomiendo. Microsoft mismo lo desaconseja y a partir de windows vista esta opción ha desaparecido.
Lo mejor es mantener aislados los servicios de los programas de usuario. Para eso lo mejor es crear un servicio y un ejecutable que lo puedes abrir en el inicio de sesion de cada usuario y que sea este quien interactue con el usuario y se comunique con el servicio (para la comunicación entre el servicio y el programa de usuario te recomiendo TCP, pero hay mas alternativas)
#13
Escrito 22 junio 2010 - 03:18
Es normal que si ejecutas un programa desde un servicio no lo veas, tienes que tener en cuenta que se ejecuta en una sesión diferente a la del usuario.
Una solución es marcar en las propiedades del servicio una opción que dice algo asi "Permitir a los servicios que interactuen con el escritorio", aunque es una opción que no te recomiendo. Microsoft mismo lo desaconseja y a partir de windows vista esta opción ha desaparecido.
Lo mejor es mantener aislados los servicios de los programas de usuario. Para eso lo mejor es crear un servicio y un ejecutable que lo puedes abrir en el inicio de sesion de cada usuario y que sea este quien interactue con el usuario y se comunique con el servicio (para la comunicación entre el servicio y el programa de usuario te recomiendo TCP, pero hay mas alternativas)
Vaya, pero entonces como puedo hacer que mi aplicación se ejecute como servicio, es decir, sin tener que iniciar sesión de usuario

Salud OS
#14
Escrito 22 junio 2010 - 04:05
Quizás lo que buscas es que se ejecute en cualquier sesión que se abra, para lo que basta que lo introduzcas en el registro:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\
En esta clave añades un valor tipo cadena con el nombre del programa y sus parámetros.
Saludos.
#15
Escrito 22 junio 2010 - 04:12
Como te he expuesto seoane, una aplicación que corre como servicio no puede interactuar con el usuario directamente. No tiene sesión de usuario y por tanto su escritorio no es visible. Cada aplicación que nazca del servicio tendrá los mismos vicios.
Quizás lo que buscas es que se ejecute en cualquier sesión que se abra, para lo que basta que lo introduzcas en el registro:
delphi
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\
En esta clave añades un valor tipo cadena con el nombre del programa y sus parámetros.
Saludos.
Gracias escafandra, lo que necesito es que mi programa se ejecute sin tener que iniciar sesión, les explico, si por alguna causa la computadora se reinicia y no es atentida por un usuario, mi sistema no se inicia y se pierde información hasta que se inicia sesión, por esa razón es que es de vital importancia que se inicie y reciba la información que le llega aún sin iniciar una sesión.
Voy a intentar sobre la cuestión de la comunicación a través de TCP.
Salud OS
#16
Escrito 22 junio 2010 - 04:18
...Voy a intentar sobre la cuestión de la comunicación a través de TCP.
Me parece una buena idea.

Saludos.
#17
Escrito 22 junio 2010 - 04:19
...Voy a intentar sobre la cuestión de la comunicación a través de TCP.
Me parece una buena idea.
Saludos.





Salud OS
#18
Escrito 23 junio 2010 - 07:06
Si es así porque no haces un servicio que este continuamente leyendo el puerto serie, y cada vez que reciba algún dato lo guarde en una base de datos. Asi inicie sesion o no el usuario los datos nunca se pierden, ademas para leer el puerto serie y guardar los datos en una base de datos no necesitas interactuar con el usuario para nada.
Luego desde la aplicación del usuario solamente tienes que leer los datos desde la base de datos (un simple select * from ...). Solamente recuerda que la base de datos debe admitir conexiones TCP (firebird, mysql, sql server, etc ...) de esta manera podrás acceder tanto desde el servicio como desde el programa de usuario sin problemas.
¿Que te parece esta opcion?
#19
Escrito 23 junio 2010 - 09:08
Creo recordar que tu aplicación recibía los datos por el puerto serie procedentes de un tarifador telefónico ¿me equivoco?
Si es así porque no haces un servicio que este continuamente leyendo el puerto serie, y cada vez que reciba algún dato lo guarde en una base de datos. Asi inicie sesion o no el usuario los datos nunca se pierden, ademas para leer el puerto serie y guardar los datos en una base de datos no necesitas interactuar con el usuario para nada.
Luego desde la aplicación del usuario solamente tienes que leer los datos desde la base de datos (un simple select * from ...). Solamente recuerda que la base de datos debe admitir conexiones TCP (firebird, mysql, sql server, etc ...) de esta manera podrás acceder tanto desde el servicio como desde el programa de usuario sin problemas.
¿Que te parece esta opcion?
Efectivamente amigo Soane, así lo he soñado

Salud OS
#20
Escrito 23 junio 2010 - 03:57
No estoy muy puesto en lo que es Servicios y en los distintos niveles de acceso que estos tienen.
Domingo, disculpa si vengo con un argumento filosófico: Para que el servicio pueda tirar contra la base de datos, el motor debe estar activo. En el caso de Firebird, cuyo motor se ejecuta como servicio, y si bien por lo general este se ejecuta como (si no me falla la memoria) SYSTEM y arranca ni bien se inicia el SO (o al menos eso tengo entendido


Además, dependiendo de como esté configurado el motor no siempre arrancará automáticamente, y es necesario reiniciarlo manualmente.
No se como será con otros motores de base de datos (y si es que hay que considerar este escenario).
Una posible alternativa es que el servicio de Eliseo, espere al servicio del motor (si estamos hablando de Firebird... repito... no se como serán los otros) o bien, para no estar perdiendo datos... que guarde un archivo temporal con los datos obtenidos al momento y en cuanto esté disponible el motor mandarlos.
Ahora mi pregunta... ¿Es posible añadir componentes de acceso a base de datos cuando la aplicación es un servicio? No lo he probado, pero me asalta la duda.

Saludos,