2008-10-17 18 views
6

Tengo una aplicación de Visual Basic que tiende a dañarse gravemente si la instalación se ejecuta más de una vez. Parece que ocasionalmente el cliente confunde al instalador con el acceso directo más adelante, ejecuta el instalador nuevamente y lo arruina todo. No puedo entender por qué, así que decidí que la manera más fácil sería hacerlo para que el ejecutor solo pudiera ejecutarse una vez en una máquina, de lo contrario, terminaría. ¿Algunas ideas?La mejor manera de hacerlo es que un exe solo se puede ejecutar una vez

+0

¿Desea que el instalador se ejecute solo una vez (1) o la aplicación en sí (2)? Si (1) el título de su pregunta es confuso, si (2) entonces su pregunta en sí es difícil de seguir. – Kramii

Respuesta

3

Haga que su instalador coloque un archivo en la carpeta de aplicaciones.

Cuando se ejecuta nuevamente, verifique que exista ese archivo, si existe, muestre una ventana emergente "Ya está instalado" y salga.

+0

¿Qué sucede si el usuario elimina el archivo manualmente? – eyelidlessness

+0

Y si el programa Crash ... –

+1

Entonces ese usuario merece un programa roto – FlySwat

1

Puede hacer que el archivo EXE del instalador se elimine solo, no directamente mientras se está ejecutando, pero pase una llamada a otro servicio para eliminarlo después de que se haya ejecutado.

pensé que esto era interesante haciendo lo busqué en Google, parece como buena información sobre este mensaje:

http://www.autohotkey.com/forum/topic1572.html

2

Asumiendo que esto es una cuestión de VB6, puede utilizar el construido en App.PrevInstance.

Documentación: http://msdn.microsoft.com/en-us/library/aa268085(VS.60).aspx

App.Previnstance devuelve True si la aplicación ya está en ejecución.

En el evento de carga del formulario de inicio o de su Sub Main:

Private Sub Form_Load() 
    If App.PrevInstance = True Then 
     MsgBox "Already running" 
     'Do whatever you need to do before closing 
    End If 
End Sub 

Si quieres ir un paso más allá y llevar el caso anterior al primer plano, puede consultar los siguientes artículos:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=21131&lngWId=1

http://support.microsoft.com/kb/185730

+0

Se le pasó por alto el punto de la pregunta. Es cómo correr una vez, no de a una por vez. (No es que correr una vez sea la solución al problema real de OPs) –

0

Si está utilizando VB.NET con Visual Studio 2005 o 2008 puede ch seleccione la opción 'Hacer aplicación de instancia única' en la sección Marco de la aplicación de Windows de la pestaña Aplicación en la configuración del proyecto.

+0

Se perdió el punto de la pregunta. Es cómo correr una vez, no de a una por vez. (No es que correr una vez sea la solución al problema real de OPs) –

0

¿Quizás sería útil verificar los procesos en ejecución en la máquina para indicarle si existe otra instancia? Ver this thread para más información ...

+0

Se perdió el meollo de la pregunta. Es cómo correr una vez, no de a una por vez. (No es que correr una vez sea la solución al problema real de los OP). –

1

Si está utilizando .net entonces Mutex es su amigo aquí.

Nunca, nunca use el método Process.GetProcessesByName. Solo se odiará más tarde por usar algo que requiere privilegios de administrador

private bool CanIStart 
{ 

     try 
      { 
       MyAppMutex= new Mutex(false, "myAppMutex", out createdNew); 
       if(MyAppMutex.WaitOne(0,false)) 
       { 
        return true; 
       } 
       else 
       { 
        MyAppMutex = null; 
        return false; 
       } 

      } 
      catch(ApplicationException ex) 
      { 
       // we couldn't create the mutex. // log the error if you care 
       return false;    
      } 
} 
+0

Los mutexes no son útiles, no quiere decir instancias concurrentes. – Tim

1

Haga que el instalador cree una entrada de registro. No instale (nuevamente) si la entrada del registro ya existe.

La manera exacta de lograr esto dependerá de la tecnología del instalador que esté utilizando.

6

¿Por qué no fijar el instalador o cualquier problema que están ocurriendo en lugar de tratar de hacer algún artilugio para evitar que ...

Sólo mi $.02

1

En la aplicación de instalación de

' Test eventual mark, settings in the registry. 
if GetSetting("MyInstallerApp","Startup","BeenHere",0) = 1 then 
    MsgBox "This installer was ran once already... first run the un-installer." 
    End ' or some other code to properly exit the installer 
EndIf 
Call SaveSetting ("MyInstallerApp","Startup", "BeenHere", 1) 'leave a mark for future 

En la aplicación de desinstalación (o el "desinstalar" la opción del instalador)

' Allow future Installer to run again 
Call DeleteSetting("MyInstallerApp", "Startup") 
0

Me parece que dejando una aplicación en torno a que no debería ser ejecutado más de una vez es como dejar un gran botón rojo en algún lugar del escritorio de alguien, que cuando lo empuja explota en el escritorio. No genial.

La mayoría de los instaladores tienen una función para no ofrecer la instalación repetida. Verifique primero, esa parece ser la mejor y más obvia solución.

¿Qué está gravemente desordenado? ¿Cómo funciona el instalador por segunda vez diferente de ejecutarlo el primero desde el punto de vista de su aplicación? Eso también debe abordarse en su código.

0

Puede verificar y ver si los archivos de la aplicación instalada ya existen. Suponiendo que sea así, usted sabe dónde se instaló la aplicación.

Cuestiones relacionadas