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
Respuesta
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.
¿Qué sucede si el usuario elimina el archivo manualmente? – eyelidlessness
Y si el programa Crash ... –
Entonces ese usuario merece un programa roto – FlySwat
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:
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
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) –
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.
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) –
¿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 ...
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). –
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;
}
}
Los mutexes no son útiles, no quiere decir instancias concurrentes. – Tim
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.
¿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
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")
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.
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.
- 1. .Net Deep cloning: ¿cuál es la mejor manera de hacerlo?
- 2. ¿Cuál es la mejor manera de asegurarse de que solo se esté ejecutando una instancia de un programa Perl?
- 3. AsyncTask Threading Rule - ¿Se puede usar solo una vez?
- 4. ¿Puedo ejecutar una actividad de Android solo la primera vez que se abre una aplicación?
- 5. ¿El compilador solo compilará el código que se puede ejecutar?
- 6. ¿Cuál es la mejor manera de solo permitir que se incluya un archivo PHP?
- 7. ¿Cómo se permite ejecutar solo una instancia de un programa Java a la vez?
- 8. ¿Cómo hacer que un bookmarklet se ejecute solo una vez?
- 9. AS3 - Escucha de eventos que solo se activa una vez
- 10. Obteniendo un forech para ejecutar una vez
- 11. ¿La mejor manera de ejecutar periódicamente un script PHP?
- 12. Twisted + SQLAlchemy y la mejor manera de hacerlo
- 13. ¿Cómo asegurar que un servicio web de Asmx solo se llame una vez a la vez?
- 14. ¿Se puede comprimir una aplicación de Windows .NET en un solo .exe?
- 15. La aplicación Can .Net se puede convertir en una aplicación portátil, es decir, solo .exe
- 16. Una mejor manera de hacerlo XML en Java
- 17. ¿Cuál es la mejor manera de implementar una función de "última vez que se ve" en una aplicación web django?
- 18. ¿Puede MSTest ejecutar un método específico cada vez que se inicia?
- 19. La mejor manera de hacerlo: no en jQuery?
- 20. En XSLT, puedo ejecutar una plantilla solo una vez
- 21. Manera pitónica de trabajar solo la primera vez que se llama una variable
- 22. ¿Cuál es la mejor manera de truncar una URL para que se ajuste a un diseño
- 23. Haciendo que algunos códigos solo se ejecuten una vez
- 24. ¿Se puede llamar a ServletFileUpload.parseRequest() solo una vez por solicitud?
- 25. ¿existe un límite en la cantidad de hilos que ruby puede ejecutar a la vez?
- 26. Cómo asegurarme de que un usuario solo puede votar una vez en una encuesta de ASP.NET
- 27. La mejor manera de verificar si una aplicación de iPhone se está ejecutando por primera vez
- 28. ¿Cuál es la mejor manera de implementar una propiedad que es de solo lectura para el público, pero que se puede escribir en los herederos?
- 29. ¿Cuál es la mejor manera de ejecutar algunos JS inmediatamente después de cargar un elemento?
- 30. Cronjob: ¿cómo hacerlo de la manera correcta?
¿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