tipos significado que imprimir entero ejemplos declaracion datos convertir cadena binario c++ file launcher

significado - ¿Cómo puede reemplazarse un binario en C++?



tipos de datos en c (6)

Hice esta pregunta en un contexto de diseño más general antes. Ahora, me gustaría hablar sobre los detalles.

Imagina que tengo app.exe ejecutándose. Descarga update.exe en la misma carpeta. ¿Cómo app.exe podría copiar update.exe sobre el contenido de app.exe ? Estoy preguntando específicamente en un contexto de C ++. ¿Necesito algún tipo de aplicación de mediación tercero? ¿Debo preocuparme por el bloqueo de archivos? ¿Cuál es el enfoque más robusto para una actualización binaria en sí (salvo que el personal de TI desagradable tenga permisos de archivos extremos)? Idealmente, me gustaría ver soluciones portátiles (Linux + OSX), pero Windows es el objetivo principal.


  1. Mueva / Cambie el nombre de la aplicación app.exe a app_old.exe
  2. Mueva / update.exe nombre de su update.exe descargado a app.exe
  3. Con el siguiente inicio de su aplicación, se usará la actualización

Cambiar el nombre de una ejecución, es decir, dll / exe bloqueado no es un problema en Windows.


En Linux, es posible eliminar el ejecutable de un programa en ejecución, por lo tanto:

  • descargar app.exe~
  • eliminar ejecutando app.exe
  • renombrar app.exe~ a app.exe

En Windows no es posible eliminar el ejecutable de un programa en ejecución, pero es posible cambiarle el nombre:

  • descargar app.exe~
  • renombrar ejecutar app.exe a app.exe.old
  • renombrar app.exe~ a app.exe
  • al reiniciar remove app.exe.old

En Windows, al menos una aplicación en ejecución está bloqueando su propio archivo .exe y todos los archivos .dll enlazados estáticamente. Esto evita que una aplicación se actualice directamente, a clientes potenciales si desea evitar un reinicio (si la reinicialización es MOVEFILE_DELAY_UNTIL_REBOOT la aplicación puede pasar el indicador MOVEFILE_DELAY_UNTIL_REBOOT a MoveFileEx y es libre de ''sobrescribir'' su propio .exe, como se retrasa de todos modos). Esta es la razón por la cual las aplicaciones típicamente no comprueban las actualizaciones en su propio .exe, sino que comienzan una revisión que busca actualizaciones y luego lanza la aplicación ''real''. De hecho, el ''shim'' incluso puede ser hecho por el propio sistema operativo, en virtud de un archivo de manifiesto configurado correctamente. La aplicación desarrollada de Visual Studio obtiene esto como una herramienta empaquetada de asistente prefabricada, consulte Despliegue ClickOnce para aplicaciones de Visual C ++ .

La aplicación típica de Linux no se actualiza debido a los muchos y variados sabores del sistema operativo. La mayoría de las aplicaciones se distribuyen como fuente, se ejecutan a través de alguna versión de auto-hell para autoconfigurarse y compilarse, y luego se instalan a través de make install (todas estas pueden automatizarse detrás de un paquete). Incluso las aplicaciones que se distribuyen como binarios para un sabor específico de Linux no se copian, sino que instalan la nueva versión una al lado de la otra y luego actualizan un symbolic link para ''activar'' la nueva versión (de nuevo, un paquete el software de gestión puede ocultar esto).

Las aplicaciones de OS X caen en el cubo de Linux si tienen el sabor de Posix, o caen en el cubo de la aplicación Mac AppStore que maneja las actualizaciones por usted.

Me gustaría que su propia actualización automática nunca llegue a la sofisticación de ninguna de estas tecnologías (ClickOnce, RPM, AppStore) y ofrezca al usuario el comportamiento esperado en relación con el descubrimiento, la actualización y la desinstalación. Me gustaría ir con la corriente y usar estas tecnologías en sus respectivas plataformas.


Solo una idea para superar el problema de "reinicio". ¿Qué hay de hacer un programa que no necesita ser actualizado? Simplemente impleméntelo en una estructura de complementos, por lo que solo se trata de un host de actualización que a su vez carga un archivo .dll con toda la funcionalidad que su programa necesita y llama a la función principal allí. Cuando detecta una actualización (posiblemente en un hilo separado), le dice al manejador dll que cierre, reemplaza el archivo y carga el nuevo. De esta forma, la aplicación se mantendrá ejecutándose mientras se actualiza (solo se vuelve a cargar el archivo dll pero la aplicación sigue ejecutándose).


Use un 3er ejecutable de actualización como muchas otras aplicaciones.

  • Descargue nueva versión.
  • Programe su actualizador para reemplazar la aplicación con la nueva versión.
  • Cerrar la aplicación principal
  • Updater se ejecuta y hace el trabajo.
  • Updater ejecuta una nueva versión de tu aplicación.
  • El actualizador se cierra.