# Evitar multiples instancias de nuestra Aplicación

**URL:** <https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336>\
**Category:** Velneo\
**Created:** [9 Septiembre, 2014 23:50 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336 "2014-09-09T23:50:50Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [9 Septiembre, 2014 23:50 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/1 "2014-09-09T23:50:50Z")

</div>

Hola a todos.  
Espero que hayáis tenido unas buenas vacaciones LifeIfSoft.  
Ya veo que se ha animado algo el foro y por eso quiero aportar algo en este comienzo de curso.

Seguro que alguna vez habéis tenido la necesidad de evitar que el Usuario arranque más de una vez la Aplicación Velneo y como no he encontrado nada en el foro, os cuento mi experiencia (solo válido para Windows).

El problema a resolver es el siguiente:

- El Usuario dispone en el escritorio de un acceso directo (.lnk) apuntando a vClient.exe y con el parámetro de la ruta VATP correspondiente.
- El Usuario arranca el acceso directo y minimiza la aplicación en la barra de Tareas.
- El Usuario arranca de nuevo el acceso directo y en este caso la ventana de la Aplicación debe mostrarse en pantalla restaurando su posición y tamaño anteriores.

He contemplado 3 formas de controlar la Multi Instanciación de una Aplicación en la misma máquina.

1º - Tenemos una variable global en 3º plano APP\_INSTANCIAS en la que en el PRE del Autoexec iremos guardando las máquinas que van haciendo conexión en el vServer. La información a guardar puede ser APP\_SIGLAS + getClientIP(). En el PRE del autoexec comprobamos si existe APP\_SIGLAS + getClientIP() en APP\_INSTANCIAS y en caso afirmativo devolvemos 0 para salir de la Aplicación. En el OnClose de la Aplicación elimino la información en APP\_INSTANCIAS.  
Para activar la ventana de la Aplicación que está minimizada he recurrido a las DLL’s del API Win32 pero con Velneo y su pésima gestión de DLL’s he sido incapaz.

2º - La 1º opción tiene el problema de que si vClient se cierra anormalmente la variable global APP\_INSTANCIAS en 3P quedaría con un valor inconsistente. Así que visto mi fracaso con la gestión de DLL’s de Velneo recurrí a una herramienta de Script que contemplara funciones de acceso al API de Windows. Dicha herramienta se llama AutoIt3 ([https://www.autoitscript.com/site/autoit/](https://www.autoitscript.com/site/autoit/ "AutoIt3")). Solo tenemos que adjuntar el Runtime Autoit3.exe a nuestra aplicación y podremos ejecutar macros con mucha mayor potencia que con VBScript.

Para comprobar si la Aplicación ya está instanciada y activar la ventana, creamos un fichero **activarventana.au3** con el siguiente código:  
``

```

; Comprueba que existe la ventana y la Activa
if WinExists ( TITULO ) then
WinActivate ( TITULO )
else
; Devuelve 1 para indicar error
exit (1)
endif

```

  
TITULO es el título de la Ventana principal de nuestra Aplicación.

Usamos en el PRE del autoexec un proceso PRO\_MULTI\_SETUP que preguntará si nuestra Aplicación admite Multiinstanciación. Si la respuesta es negativa ejecutará la macro (sysCacheClientPath/AutoIt3.exe activarventana.au3) para probar si puede activar una ventana de la Aplicación instanciada. Si la macro tiene éxito cerramos la instancia actual (PRO\_MULTI\_SETUP retorna 0). Si la macro devuelve Error la ejecución del autoexec sigue normalmente.

3º - La 2º opción tiene una pequeña pega. Para comprobar la multi instanciación el usuario debe pasar siempre por el proceso de Login. Así que recurrimos a la 3º opción que consiste en comprobar si la Aplicación está activa antes de ejecutar vClient.exe.  
Usamos también AutoIt3 (en este caso un exe con la macro compilada). Disponemos en una carpeta de lo siguiente:  
1- El Script **lanzador\_velneo.au3** que compilamos como **\_lanzador\_velneo.exe**  
2- Los accesos directos **.LNK** de nuestras Aplicaciones que ejecutan vClient.exe con el VATP de conexión  
El ejecutable **lanzador\_velneo.exe** recibe como parámetro el nombre del acceso directo .lnk (ejem: lanzador\_velneo.exe 0PS\_APP\_2). Comprueba si la Aplicación está en ejecución. Si es así activa la ventana de la Aplicación y en caso contrario usa la función SHELLEXECUTE() para ejecutar el fichero .lnk pasado como parámetro.  
Adjunto un ejemplo de lanzador\_velneo.au3 que muestra esta técnica.  
Este sistema es el que mejor resultados ha obtenido: disponemos de los accesos directos lnk originales y además las aplicaciones se instancian en la Barra de Tareas de forma independiente sin combinar los botones cuando esta opción está activada en Win7 o Win8.

Me imagino que esta cuestión de la Multi Instanciación la habréis resuelto de diversas formas y me gustaría conocer vuestras opciones.

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [9 Septiembre, 2014 23:53 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/2 "2014-09-09T23:53:10Z")

</div>

Como siempre el adjunto va después.

[lanzador\_velneo.zip](https://canada1.discourse-cdn.com/flex035/uploads/velneo/original/2X/b/bcbb13824a532db59c42396c41fee88d5e1f4593.zip) (1.36 KB)

---

<div class="post-metadata">

**Author:** ![Lydia.dfr](https://avatars.discourse-cdn.com/v4/letter/l/898d66/32.png) [@Lydia.dfr](https://foros.velneo.com/u/Lydia.dfr)\
**Post date:** [10 Septiembre, 2014 06:12 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/3 "2014-09-10T06:12:12Z")

</div>

Muchas gracias por tu aporte @seh , siempre dandonos cosas interesantes y útiles que probar y aplicar.

---

<div class="post-metadata">

**Author:** ![ramiroperezacebo](https://avatars.discourse-cdn.com/v4/letter/r/50afbb/32.png) [@ramiroperezacebo](https://foros.velneo.com/u/ramiroperezacebo)\
**Post date:** [10 Septiembre, 2014 07:47 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/4 "2014-09-10T07:47:00Z")

</div>

Buenos dias, Paco

Bienvenido a casa. Se te echaba de menos…

Saludos. Ramiro

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [10 Septiembre, 2014 10:38 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/5 "2014-09-10T10:38:36Z")

</div>

Gracias por compartir, la verdad siempre he sido fan de autoit te saca de muchos apuros

---

<div class="post-metadata">

**Author:** ![naturalsoft](https://avatars.discourse-cdn.com/v4/letter/n/5fc32e/32.png) [@naturalsoft](https://foros.velneo.com/u/naturalsoft)\
**Post date:** [10 Septiembre, 2014 15:42 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/6 "2014-09-10T15:42:01Z")

</div>

Gracias por el aporte.

---

<div class="post-metadata">

**Author:** ![mdelgado](https://avatars.discourse-cdn.com/v4/letter/m/cc9497/32.png) [@mdelgado](https://foros.velneo.com/u/mdelgado)\
**Post date:** [11 Septiembre, 2014 08:17 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/7 "2014-09-11T08:17:43Z")

</div>

Y por qué no usar un vClien personalizado mediante QML?

De esta forma, al hacer click en el icono compruebas antes de nada si ya hay una instancia abierta. Si lo está la maximiza y sino ejecutas login

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [11 Septiembre, 2014 09:10 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/8 "2014-09-11T09:10:57Z")

</div>

Hola mdelgado.

Sí, por supuesto, ya había pensado en esa posibilidad. Incluso estuve mirando la raquítica documentación que hay al respecto y obtuve algunas conclusiones positivas, véase [http://velneo.es/foros/topic/cliente-offline-qml](http://velneo.es/foros/topic/cliente-offline-qml/).

La verdad es que sin un buen editor/depurador de QML y mis nulos conocimientso de Qt/C++ prefiero esperar a que Velneo se ponga las pilas en este y otros temas. De momento soy más productivo con AutoIt3.

¡¡ Qué más quisiera yo que hubiera ya cientos de componentes QML en el mercado compatibles con Velneo !!

Para un experto en QML seguro que resolver este problema es muy sencillo. A ver si alguien se anima.

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![carlosajaime](https://avatars.discourse-cdn.com/v4/letter/c/eb9ed0/32.png) [@carlosajaime](https://foros.velneo.com/u/carlosajaime)\
**Post date:** [28 Enero, 2021 13:33 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/9 "2021-01-28T13:33:04Z")

</div>

Hola Paco.

Me he encontrado este hilo, tratando de buscar una solución a la disponibilidad de conexiones al servidor en una red, para que un solo equipo solo consuma una, me he declinado por la opción 3 sugerida en tu ejemplo, pero Windows me dice que no encuentra el archivo .lnk, pero autoit si valida su existencia.

Espero ser claro, muchas gracias por tu ayuda.

Saludos.  
Carlos Jaime

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [28 Enero, 2021 18:04 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/10 "2021-01-28T18:04:37Z")

</div>

Hola Carlos.

El archivo .lnk es el acceso directo que usarías para ejecutar la aplicación normalmente desde el Escritorio de Windows.

Por ejemplo:

- Ahora tienes un acceso directo llamado MiERP en el escritorio

- Mueve ese acceso directo a una carpeta del disco, por ejemplo _d:\MisApps_

- Tendrás entonces un archivo _d:\MisApps\MiERP.lnk_

- Copia a esta carpeta el ejecutable AutoIt compilado _ **\_lanzador\_velneo.exe** _ después de haber añadido la aplicación en la sección correspondiente:

- El Título debe ser el mismo que has asignado al AUTOEXEC de la aplicación.

- Crea un nuevo Acceso directo al lanzador de aplicaciones (Lanzador\_MiERP) con el parámetro _MiERP_ \>\>\>\> _d:\MisApps\_lanzador\_velneo.exe MiERP_

- Este nuevo Acceso directo _ **Lanzador\_MiERP** _ es el que usará a partir de ahora el Usuario para prevenir ejecuciones simultáneas desde un mismo PC.

El lanzador **\_lanzador\_velneo.exe** buscará el Acceso directo **MiERP.lnk** en la misma carpeta y lo ejecutará en el caso de que la aplicación no esté ejecutándose.

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![carlosajaime](https://avatars.discourse-cdn.com/v4/letter/c/eb9ed0/32.png) [@carlosajaime](https://foros.velneo.com/u/carlosajaime)\
**Post date:** [2 Febrero, 2021 15:45 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/11 "2021-02-02T15:45:36Z")

</div>

Hola Paco.

Hice todo lo que me dices, pero me sale el mismo mensaje que cuando lo hago con los parámetros de prueba:

![image](https://canada1.discourse-cdn.com/flex035/uploads/velneo/original/2X/2/2fbff952f5522cf7415d4b659d7f0a3762ae939d.png)

Como si no existiera el acceso directo pero ahí esta.

Quedo atento a cualquier otra recomendación.

Saludos.  
Carlos A. Jaime

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [3 Febrero, 2021 13:40 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/12 "2021-02-03T13:40:28Z")

</div>

Hola Carlos.

Seguramente la función shellexecute del API de Windows ya no ejecute la extensión LNK.

Lo que vas a hacer es indicar en el script de AutoIt la ruta VATP de acceso a la Instancia en lugar del archivo LNK y usas la función Run.

```
Switch $CmdLine[1]
  	case "MiERP"
  		$cAccesoDirecto = "C:\Program Files\Velneo\vClient.exe vatp://USUARIO:*@<SERVIDOR>/INSTANCIA_ERP")
  		$cTitulo = "Mi Aplicación ERP"
  	case "0PS_APP_2"
         .....
EndSwitch

```

Y comentas las últimas líneas del script añadiendo Run($cAccesoDirecto).

```
;~ If FileExists($cAccesoDirecto) = 0 Then
;~ MsgBox($MB_ICONWARNING,"Aplicación - " & $cTitulo,"No existe el acceso directo " & $cAccesoDirecto, 5)
;~ Exit
;~ EndIf
; MsgBox(0,$cTitulo,"Acceso directo a ejecutar -> " & $cAccesoDirecto)
; ShellExecute($cAccesoDirecto)
Run($cAccesoDirecto)

```

Con esto ejecutas directamente el ejecutable vClient.exe y prescindes del LNK original.

Pruébalo  
Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![carlosajaime](https://avatars.discourse-cdn.com/v4/letter/c/eb9ed0/32.png) [@carlosajaime](https://foros.velneo.com/u/carlosajaime)\
**Post date:** [3 Febrero, 2021 16:41 UTC](https://foros.velneo.com/t/evitar-multiples-instancias-de-nuestra-aplicacion/7336/13 "2021-02-03T16:41:05Z")

</div>

Excelente paco, muchas gracias.

Saludos.

Carlos Andres Jaime.
