Newsgroup: it.comp.lang.delphi
Titolo: Mettere un file nell'exe (e poi modificarlo)

Salve! Ho la necessita' di mettere un file di dati all'interno di un exe, in
modo da poter distribuire un solo file. Ho trovato alcuni componenti ma
nessuno fa al caso mio, perche' oltre a leggere il file, vorrei anche
poterlo scrivere (sempre dentro l'exe)..
chiedo troppo ? :-)
Ciao !                        {MSX}

 chiedo troppo ? :-)
insomma !! eheheh
Mi pare che dovrei avere un componente che faccia qualcosa del genere. Però
fa tutto di testa sua.
Ricordo che era un componente che modificava lo stesso eseguibile per
proteggerlo ( sicurezza insomma ). Ti ci guardo se lo trovo.....intanto
ragioniamo un secondo.
Allora, cominciamo dall'inizio.
Riesci a mettere dati generici dentro l'exe e leggerli solamente ?
Penso di si, perchè con un normale file RES lo fai tranquillamente. Insomma
fai il file RES, lo specifichi con una direttiva di compilazione e poi
quando compili l'exe, ci butti all'interno anche il file RES che tramite
opportune funzioni può essere estratto.
Ora per scriverci sopra è complesso per due motivi:
1) non puoi modificare l'exe durante l'esecuzione ( problema tosto ma si
aggira se non sbaglio )
2) come modifichi il file RES oppure i dati contenuti e ricompili la risorsa
incorporandola all'interno dell'eseguibile ?
Allora, il primo problema mi pare che può essere aggirato riscrivendo un
nuovo file EXE ( identico al primo ) ma apportando al suo interno le
modifiche ai dati che vuoi modificare.
In pratica ti ritrovi un nuovo file, con un nome diverso ( se nella stessa
directory ) con le giuste modifiche apportate.
Mi pare che la procedura era questa. Poi si manda in esecuzione il nuovo
file che deve fare tutto il resto, cioè cancellare il vecchio e rinominarsi.
Hai modificato l'exe.
Per il secondo problema, non saprei di preciso.
Non conosco il formato RES, ma immagino sia un normale stream incorporato
nell'eseguibile dove i dati realmente contenuti, rimangono invariati una
volta compilata la risorsa.
Insomma avrà qualche byte in più che magari specifica l'indirizzo di
partenza e di fine dello stream, il numero o il nome o roba del genere
perchè in un file RES ci possono andare più risorse anche diverse.
Comunque se i dati da modificare sono sempre gli stessi, cioè hanno sempre
la stessa dimensione e si tratta solo di cambiarli, credo che la strada di
andarseli a modificare direttamente nell'eseguibile, è forse la migliore.
Però, se non sbaglio c'è gente che aggiunge dati generici alla fine
dell'eseguibile, senza complicarsi la vita con risorse o roba del genere.
Io sinceramente non ci ho mai provato, non mi è mai piaciuta nemmeno questa
soluzione. Però se funziona, ti risparmi tante rogne ed hai pienamente
risolto il tuo problema.
Comunque se mi dici che genere di dati sono, forse ti aiuto e ti possiamo
aiutare un po' meglio.
Perchè se si tratta di una stringa, allora ci mettiamo a ridere ed addio
risorse, controrisorse e dati alla fine del file.
Ti saluto.....ciao ciao !!
Antonio Tarolla

 risorse, controrisorse e dati alla fine del file.
Ehehe sono.... file di testo ! :-)
Allora provero' in questo modo! Vediamo cosa salta fuori...
Ciao e grazie !                    {MSX}

 Ciao e grazie !                    {MSX}
ma figurati.....prova prova. Buon lavoro.
Ciao.
Antonio Tarolla

 poterlo scrivere (sempre dentro l'exe)..
In che senso scriverlo? modificare l'exe mentre e' in esecuzione o a
link-time?
Nel primo caso non saprei (*), nel secondo c'e' un esempio di inclusione
di file di risorse sul repository del ng di cantu'.
(*) a meno, appunto, di inserire anche un linker nel tuo eseguibile che
periodicamente rilinki l'exe, se stesso e il file di dati. Buon lavoro
:)
--
Saluti
Paolo Arosio


Forse :)
Dunque... se lavori con NT, esistono : BeginUpdateResource,
UpdateResource, EndUpdateResource, ma non risolvono il problema della
modifica di un file mentre è aperto.
Il problema è che in teoria, per quanto ne so, non si potrebbe.
Pur dandoti lo stesso consiglio di Antonio, cioè di creare un file
esterno, lanciarlo ecc. ecc., che penso sia una soluzione adottata da
molti, non posso non dirti che ho sentito "vociferare", che sia
possibile ingannare il sistema operativo e forzare la modifica su di un
file aperto in sola lettura (come immagino sia un eseguibile, ma non
conosco i dettagli), cambiando appunto l'accesso al file (RW).
E' ovvio che un tale barbatrucco sarebbe molto poco sicuro, giacchè non
supportato dal sistema (e quindi imprevedibile negli effetti
collaterali) e, soprattutto, non vedo l'estrema necessità di doverlo
attuare, potendoti appoggiare su di un file temporaneo.
Però, se ci riesci, fammelo sapere ;-PPP
--
Ciao !  Davide DG.