Jump to content


Photo

¿Cómo ejecutar tu aplicación junto con Windows?


  • Please log in to reply
12 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 22 September 2009 - 04:51 PM

Si deseas que tu aplicación se inicie junto con Windows, pues aquí dejo el code de cómo hacerlo:



delphi
  1. uses Registry;
  2. ...
  3.  
  4. procedure AutoInicio;
  5. var key: string;
  6.     Reg: TRegIniFile;
  7. begin
  8.   key := '\Software\Microsoft\Windows\CurrentVersion\Run';
  9.   Reg := TRegIniFile.Create;
  10.   try
  11.     Reg.RootKey:=HKEY_LOCAL_MACHINE;
  12.     Reg.CreateKey(Key);
  13.     if Reg.OpenKey(Key,False) then Reg.WriteString(key, 'Nombre Aplicación', 'c:\aplicacion.exe');
  14.   finally
  15.     Reg.Free;
  16.   end;
  17. end;



Y para removerlo:



delphi
  1. uses Registry;
  2. ...
  3.  
  4. procedure RemoverAutoInicio;
  5. var key: string;
  6.     Reg: TRegIniFile;
  7. begin
  8.   key := '\Software\Microsoft\Windows\CurrentVersion\Run';
  9.   Reg:=TRegIniFile.Create;
  10. try
  11.   Reg.RootKey:=HKey_Local_Machine;
  12.   if Reg.OpenKey(Key,False) then Reg.DeleteValue('Nombre de la Aplicación');
  13.   finally
  14.   Reg.Free;
  15.   end;
  16. end;



Qué lo disfruten (y).

Saludos.
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 22 September 2009 - 05:00 PM

:o mil gracias Enecumene, justo estoy trabajando en algo que se verá de perlas con esto...  (y)

Saludox !  :D
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 22 September 2009 - 05:03 PM

Justo a tiempo ¿no? :D
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 22 September 2009 - 05:14 PM

Dicen que es mejor llegar a tiempo que ser invitado :D :D :D

Gracias por el aporte amigo (y)

Salud OS

  • 0

#5 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 22 September 2009 - 07:29 PM

Hola
Muy bueno amigo, siempre con aportes interesantes y nutritivos.
Saludos
  • 0

#6 felipe

felipe

    Advanced Member

  • Administrador
  • 3283 posts
  • LocationColombia

Posted 22 September 2009 - 08:06 PM

Solo una cosa amigo, ¿en que momento o cómo es la aplicación de este código?


Saludos!
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 23 September 2009 - 06:36 AM

Solo una cosa amigo, ¿en que momento o cómo es la aplicación de este código?


Saludos!


Amigo, eso lo puedes aplicar como parte de las configuraciones de tu sistema, por ejemplo, tu sistema tiene un apartado de opciones y configuraciones, en ella se encuentra un checkBox llamado "ejecutar programa al iniciar Windows" algo común en muchos programas y sistemas, lo cotejas, y lo guardas, por ejemplo:



delphi
  1. if CheckBox1.Checked then begin
  2.   AutoInicio;
  3. end else begin
  4.   RemoverAutoInicio;
  5. end;



ó



delphi
  1. Case CheckBox1.Checked of
  2.   True:  AutoInicio;
  3.   False: RemoverAutoInicio;
  4. end;



Es muy sencillo amigo ;).

Saludos.
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 23 September 2009 - 07:18 AM

Gracias compañero, muy buen aporte.

Solo una cosa amigo, ¿en que momento o cómo es la aplicación de este código?


Saludos!


Ideal para  programas invisibles o (Tray Icon). Por ejemplo yo desrrollé una pequeña aplicación invisible con un Timer que chequea los procesos actuales, y cada que detecta el messenger lo cierra y manda al empleado a trabajar. Con el aporte de enecuneme simplemente me aseguro que arranque junto con windows.

Saludos.
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 25 January 2016 - 04:35 PM

A mi me ha picado el bicho de la duda. ¿Aplica esto mismo cuando la aplicación tiene DataModule? No he hecho la prueba de como se comportaría una aplicación que se ejecute al inicio y que además necesita de conexión a una base de datos.

Sobre todo en Lazarus, que todavía no he investigado si tiene algo de diferente a Delphi en esto.

 

En Delphi al menos, cuando uno pone TDataModules éstos se cargan al comienzo y recién los forms. ¿No hay problema en que se invoque justo en lugar del ponerlo en el Main form sino en el proyecto? Me hace dudar de si es viable (y aconsejable) poner esto en el OnCreate, que sería el primer lugar obvio.

Pero claro, de hacerlo así debería evaluar si efectivamente no existe primero la clave de inicio. Porque veamos... se ejecuta el soft ni bien se instala o se copia. Allí mismo detectamos que la clave no está y la ponemos. Al siguiente día, o reinicio, el propio Windows levanta la aplicación y de nuevo comprueba si tiene que escribir la clave. Ummm. se me hace que es más apropiado justamente tener directamente una variable tipo flag IsRegisterInAutoStart que pueda leerse desde un archivo ini para ver si tiene que escribir en el registro o no.

 

El dilema de iniciarlo con Windows en mi caso es que éste tenga el debido cuidado de ejecutarse después que el motor de base de datos sino fallará el intento de conectarse.

 

¿Cómo lo encararon ustedes?

 

Saludos,


  • 0

#10 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 posts
  • LocationArgentina

Posted 25 January 2016 - 05:19 PM

Hola Marce,

 

No llego a ver cual es el problema en primero chequear el registro y luego establecer conexion con la BD; o en el orden inverso

 

En particular yo lo implemento así para un server Datasnap, aunque aplica a cualquier tipo de aplicacion

En el .dpr:


php
  1. uses
  2. [...],
  3. App.AutoRun,
  4. App.AutoRun.Win;
  5.  
  6. var
  7. AutoRun: IAppAutoRun;
  8. begin
  9. Application.Initialize;
  10. Application.MainFormOnTaskbar := True;
  11. Application.Title := 'Servidor Pedidos';
  12. AutoRun := TWindowsRegistryAutoStart.Create;
  13. AutoRun.RegisterAutoStart;
  14. Application.CreateForm(TServerContainer, ServerContainer);
  15. Application.CreateForm(TFMain, FMain);
  16. Application.Run;

Unidades: App.AutoRun.pas y App.AutoRun.Win.pas

 

Aún asi, ahora me estoy dando cuenta que en mi interface IAppAutoRun seria bueno contar con un metodo IsAutoRunRegistered: Boolean


  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 25 January 2016 - 05:57 PM

El mayor peligro es el diseño que tiene Windows que al ejecutar los procesos estos no necesariamente respetan el mismo orden siempre.

Si se inicia la aplicación antes que el motor deberá esperar a que éste esté activo para poder conectarse. En el caso de Firebird por ejemplo, a menos que se use la versión embebida, deberá cuidarse de que el proceso Guardian se ejecute primero ya que éste es el que levanta al propio Server.

 

Lo de tener esa propiedad boolean, ¿no es justamente algo que yo comenté? Algo como primero evaluar si va a hacer falta meter la clave de registro para el inicio. ;)

 

Saludos,


  • 0

#12 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 posts
  • LocationArgentina

Posted 25 January 2016 - 06:43 PM

Ah, ahora entiendo, no lo habia pensado nunca de esa manera; si el servicio de firebird (o el que fuera) no esta vivito y coleando obviamente cuando nuestro programa arranque no va a poder conectar

 

Buen punto :)

 

En ese caso creo que lo mejor seria recurrir a la "fuerza bruta" y poner un timeout elevado

 

Aunque tenes razon en que la implementacion de Windows es realmente un desastre


  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 25 January 2016 - 07:13 PM

Yo me di cuenta ahora que analicé que mi aplicación requiere de iniciarse justamente al inicio. Y utiliza Firebird, y se me prendió la lamparita... con el ¿y que pasa si...? Y bue, hay que preveer eso. Yo también evalúo que no hay otra opción, al menos más barata, que disponer de un buen timeout y tratar de conectar unas cuantas veces hasta que entre. Es eso o rebuscarse con la posibilidad de verificar si está levantado el proceso del Server (si está el Server, por lógica lo está el Guardian... a menos que alguien intencionalmente tumbe e Guardian una vez que levanta el Server) metido en algún ciclo y jugarse con la posibilidad (muy baja) de que nunca levante...

 

En esta ocasión preveo un Embebed (muy posiblemente o quizá me anime de forma directa a usar el Super Server) pero ya ando pensando para la próxima version (será un proyecto que ira escalando) sea más elaborada, que permita un esquema Cliente Servidor... algo así como una versión Lite y una Pro.

 

Saludos,


  • 1




IP.Board spam blocked by CleanTalk.