PDA

Ver la Versión Completa : Hacer portable ejecutable con archivo access


azdin
04-11-2022, 06:27:10
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

duilioisola
04-11-2022, 09:22:12
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.

Neftali [Germán.Estévez]
07-11-2022, 09:36:02
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.

escafandra
03-12-2022, 22:33:14
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 (https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-updateresourcea) 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 (https://clubdelphi.com/foros/showthread.php?t=91537) 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 (https://clubdelphi.com/foros/showthread.php) 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" (https://clubdelphi.com/foros/showthread.php?t=91537) y la función que calcula el tamaño para Win 32 y Win64 se encuentre en esta entrada (https://clubdelphi.com/foros/showpost.php?p=513940&postcount=27) de dicho tema.


La transcribo aquí:



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.