Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-11-2022
azdin azdin is offline
Registrado
 
Registrado: dic 2013
Posts: 7
Poder: 0
azdin Va por buen camino
Hacer portable ejecutable con archivo access

Muy buen día con todos comunidad, estuve trabajando en un pequeño recordatorio que guarda los datos en un fichero Access, y va actualizando o eliminando según se maneje.

Como menciono en el título del tema, quisiera hacer portable de tal manera que el archivo access quede "dentro" del ejecutable. Estuve investigando algunos métodos, sin embargo lo que me resulta es que cuando ejecuto el archivo portable, el archivo access se extrae y se guarda en una ruta temporal. De tal manera que todo cambio que haga se modifica en esté archivo temporal, y cuando cierro el ejecutable se pierde.

Cuando nuevamente abro el ejecutable portable se vuelve a extraer la primera versión del archivo access, dando la impresión de que no está guardando.

¿Alguna idea para hacer portable estos dos archivos y que los cambios se vayan guardando?

Gracias de antemano
Responder Con Cita
  #2  
Antiguo 04-11-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Entiendo que quieres guardar información dentro del ejecutable mismo...
Se puede hacer. Los virus hacen eso mismo.

De todos modos, creo que no es lo que buscas.
Una aplicación "portable" implica que tiene todo lo que necesita para operar, sin necesidad de cosas como librerías compartidas que podrían no estár instaladas en cada ordenador.
Para ello se suele trabajar todo dentro de la misma carpeta que el ejecutable sin guardar datos en lugares como el registro de windows o carpetas personales del ordenador como "Mis Documentos".

Cuando traspasas esa carpeta de un ordenador a otro, te llevas todo encima. Por ejemplo, si trabajas desde un PenDrive.

Además de eso, si trabajas con Access y el ordenador donde se ejecuta no lo tiene instalado, no podrás ejecutar la aplicación.
Para esto puedes pensar en suluciones como Firebird Embeded o sqllite.
Responder Con Cita
  #3  
Antiguo 07-11-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Una aplicación "portable" es aquella que se puede copiar directamente de un sitio a otro de manera que sigue funcionando. Eso puedes hacerlo sin problemas diseñando la aplicación para que siempre busque la Base de Datos en el mismo directorio del ejecutable, de forma que cuando se copian todos los ficheros de la carpeta sigue funcionando.

La definición de "portable" no es necesariamente que la aplicación sea un sólo fichero.

Por otro lado lo que pretendes es muy complicado y bastabte problemático.

Si al ejecutar la aplicación "extraes" la Base de Datos y trabajas con ella, al acabar debería volvar a "introducir" la Base de Datos en el ejecutable. Para que la siguiente ejecución volver a hacer lo mismo.

Ese paso al cerrar es complicado. Primero porque el ejecutable está en memoria y se supone que deberías introducir la Base de Datos "actualizada" dentro. Muchos problemas técnicos y porque tal y como te han comentado, esa operación va a hacer "saltar" todas la alarmas de antivirus y programas de seguridad.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 05-12-2022 a las 08:43:01.
Responder Con Cita
  #4  
Antiguo 03-12-2022
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Como comentáis el asunto no es sencillo. Lo ideal es tener ese fichero Access separado. Pero si nos queremos empeñar, se puede hacer como un recurso o simplemente adherido al final del ejecutable.


1.- Si se pretende hacer como un recurso hay que usar la API UpdateResource para añadir el archivo modificado
2.- Si se quiere añadir al final del ejecutable, hay que conocer con exactitud el tamaño del ejecutable para poder extraer el archivo. El asunto de añadir es simplemente sumar archivos.


En ambos casos, es preciso que sea otra aplicación la que haga la añadidura, ya que un archivo ejecutable que se está ejecutando no se puede modificar. De esta forma, al cerrarse debería liberar una app que realice ola modificación y borre la base de datos, ese programita podría ir como un recurso y debería comprobar que su "padre" terminó su ejecución para poder modificarlo. La forma más simple es que trate de abrir en un bucle el exe, sólo podrá hacerlo si la ejecución acabó. También se puede usar el código de este hilo para conocerlo



El asunto de añadir archivos al final del ejecutable fue tratado en este tema "Cómo determinar el tamaño original de un archivo ejecutable" y la función que calcula el tamaño para Win 32 y Win64 se encuentre en esta entrada de dicho tema.


La transcribo aquí:


Código Delphi [-]
function GetExeSize: cardinal;
var
  p: PBYTE;
  i, NumSections: integer;
begin
  Result := 0; // if error then result = 0
  p := pointer(GetModuleHandle(nil));      // DosHeader  'MZ'
  inc(p, PImageDosHeader(p)^._lfanew + 4); // ImageFileHeader
  NumSections := PImageFileHeader(p)^.NumberOfSections;
  inc(p, sizeof(TImageFileHeader) + PImageFileHeader(p)^.SizeOfOptionalHeader); // IMAGE_SECTION_HEADER (SectionHeaders)
  for i:= 1 to NumSections do
  begin
    with PImageSectionHeader(p)^ do
      if PointerToRawData + SizeOfRawData > Result then
        Result := PointerToRawData + SizeOfRawData;
    inc(p, sizeof(TImageSectionHeader));
  end;
end;

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
hacer portable un proyecto compilado lisette C++ Builder 1 19-09-2012 06:54:26
¿Como hacer una Aplicacion Portable.? JXJ Varios 5 09-10-2008 05:45:19
hacer que MySQL sea portable razadi SQL 2 12-12-2006 18:43:11
Hacer Portable mi Aplicacion Sir_Roc Varios 1 09-02-2006 15:58:44
Hacer un ejecutable nesetru Conexión con bases de datos 1 08-02-2004 12:28:56


La franja horaria es GMT +2. Ahora son las 13:52:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi