Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

salvare dati nell' EXE

31 views
Skip to first unread message

{MSX}

unread,
Dec 13, 1999, 3:00:00 AM12/13/99
to
Salve a tutti !
Sto cercando un metodo per salvare dei dati all'interno di un programma in
modo da non dover ricorrere a file esterni quando devo leggerli e in modo da
far stare tutto su un solo file.

Qualcuno ha un'idea su come fare ? Preferiri codice piuttosto che componenti
già pronti (ma vanno bene anche questi se non avete codice ! :o)

Ciao e grazie a tutti ! {MSX}


Wayl

unread,
Dec 13, 1999, 3:00:00 AM12/13/99
to
Lo faccio molto spesso: Il codice di un eseguibile non viene modificato
naturalmente se gli si appende roba in coda, percui aggiungi un marker alla
fine dell'eseguibile oppure ti segni la sua grandezza cosí da sapere dove
cominciare a leggere i dati, e poi li leggi, o li scrivi, o li modifichi
utilizzando file di appoggio.

{MSX} <Lugatoso...@iol.it> wrote in message
V8c54.27120$Bg7.2...@typhoon.libero.it...

Antonio Tarolla

unread,
Dec 14, 1999, 3:00:00 AM12/14/99
to
Ciao,

{MSX} ha scritto nel messaggio ...


>Salve a tutti !
>Sto cercando un metodo per salvare dei dati all'interno di un programma in
>modo da non dover ricorrere a file esterni quando devo leggerli e in modo
da
>far stare tutto su un solo file.
>
>Qualcuno ha un'idea su come fare ? Preferiri codice piuttosto che
componenti
>già pronti (ma vanno bene anche questi se non avete codice ! :o)

il tuo problema lo puoi risolvere perfettamente utilizzando le risorse.
Se non sei pratico, dovrai documentarti.
In questo news ho lasciato due o tre messaggi (indietro di qualche giorno o
settimana) dove c' è scritto come includere nell' eseguibile un MID nell'
eseguibile, un wave, bmp o altro genere di file.
Comunque ora sono un po' di fretta e per spiegarti le risorse mi occorre un
po' di tempo ed un bel messaggione.
Se mi scrivi in privato posso inviarti un esempio che avevo preparato tempo
fa e poi mi sono dimenticato di inviarlo a chi l' aveva richiesto.
Non ti assicuro di averlo al 100%, però mi pare di averlo visto in giro
nell' HD !! eheh (è si....si stava facendo una passeggiata tra le varie
directory)
A parte gli scherzi, se vuoi scrivimi !!

Ciaoooooooo !!!!!

Antonio Tarolla

BSSoftware Tips Mailing - List Support

Pier Luigi Fiorini

unread,
Dec 14, 1999, 3:00:00 AM12/14/99
to
> Lo faccio molto spesso: Il codice di un eseguibile non viene modificato
> naturalmente se gli si appende roba in coda, percui aggiungi un marker
alla
> fine dell'eseguibile oppure ti segni la sua grandezza cosí da sapere dove
> cominciare a leggere i dati, e poi li leggi, o li scrivi, o li modifichi
> utilizzando file di appoggio.
L'unico inconveniente è che un antivirus potrebbe credere che il cambio di
dimensioni sia causato da un'infezione.

--
Pier Luigi Fiorini
www.fiorinisoft.n3.net

Andrea Bernasconi

unread,
Dec 15, 1999, 3:00:00 AM12/15/99
to
{MSX} wrote:
>
> Salve a tutti !
> Sto cercando un metodo per salvare dei dati all'interno di un programma in
> modo da non dover ricorrere a file esterni quando devo leggerli e in modo da
> far stare tutto su un solo file.
>
> Qualcuno ha un'idea su come fare ? Preferiri codice piuttosto che componenti
> già pronti (ma vanno bene anche questi se non avete codice ! :o)
>
> Ciao e grazie a tutti ! {MSX}
Se non hai voglia di usare le risorse (che non sono proprio la cosa più
semplice)
puoi includere nell'eseguibile delle "finte" procedure che in realtà
sono dati.
È sufficiente che converti il tuo file binario in un .OBJ con un
programma
come BINOBJ (era fornito col Turbo Pascal; ne ho trovata una copia
online
all'indirizzo
ftp://ftp.cs.kmitnb.ac.th/pub/software/compiler/tp.7/bin/binobj.exe)

Funziona in questo modo:

1. crei il file OBJ con un comando simile

binobj file.dat file.obj MieiDati

2. poi includi il codice

procedure MieiDati; external; {$L file.obj}

Ricordati di non chiamare quella procedura, a meno che si tratti
veramente
di codice eseguibile.
Puoi usare i tuoi dati con un puntatore, ad esempio:

var f: file;
begin
assignfile(f,'c:\temp\prova.dat');
blockwrite(f, @MieiDati, 12345); // 12345 è la dimensione di MieiDati
(quella devi saperla)
closefile(f);
end;

P.S. per scaricare binobj (se non hai Turbo Pascal) abbi pazienza: io ho
impirgato
2-3 minuti (anche se sono solo 9 kb)! Mi sembra che in Tailandia le
connessioni non
siano molto rapide...

Andrea Magni

unread,
Dec 15, 1999, 3:00:00 AM12/15/99
to
Wayl <Wa...@mailcity.NOshpalm.com> wrote in message
833s0k$c1p$1...@nslave2.tin.it...

> Lo faccio molto spesso: Il codice di un eseguibile non viene modificato
> naturalmente se gli si appende roba in coda, percui aggiungi un marker
alla
> fine dell'eseguibile oppure ti segni la sua grandezza cosí da sapere dove
> cominciare a leggere i dati, e poi li leggi, o li scrivi, o li modifichi
> utilizzando file di appoggio.

Non è così semplice scrivere su un file aperto...
Penso che si potrebbe fare così: includere (come risorsa) un piccolo exe che
non fa altro che scrivere alla fine dell'exe vero e seguire quest'ordine:
- estrarre il mini-exe dall'exe-normale
- avviare il mini-exe che dovrà aspettare che l'exe-normale termini
- termine exe-normale
- il mini-exe scrive in coda all' exe-normale i dati [con le dovute
considerazioni (cancella i vecchi dati, dimensione dei dati ecc ecc)]
- il mini-exe, prima di terminare, elimina il file di appoggio che ha
inglobato nell'exe-normale, riavvia l'exe-normale [magari con un parametro
per poter dare un feedback adeguato all'utente] e segnala all'exe-normale di
eliminare il mini-exe...

Un po' contorto ma efficace per poter salvare dati direttamente nell'exe...

Ps: io prenderei in considerazione il registry...

Ciao :-)

--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)

AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply


Andrea Magni

unread,
Dec 15, 1999, 3:00:00 AM12/15/99
to
Antonio Tarolla <a.ta...@tech.netway.it> wrote...

> il tuo problema lo puoi risolvere perfettamente utilizzando le risorse.

Ciao Antonio,
le risorse possono essere utili se vuoi salvare un
certo dato e mantenerlo costante nel tempo...
Non credo si possa (tranne che sotto NT) scrivere a run-time le risorse di
un altro Exe ma aspetto smentite... ;-)

Wayl

unread,
Dec 15, 1999, 3:00:00 AM12/15/99
to
Andrea Magni <ama...@energy.it> wrote in message
94527817...@melissa.energy.it...
[...]

> Non è così semplice scrivere su un file aperto...
> Penso che si potrebbe fare così: includere (come risorsa) un piccolo exe
che
> non fa altro che scrivere alla fine dell'exe vero e seguire quest'ordine:
> - estrarre il mini-exe dall'exe-normale
> - avviare il mini-exe che dovrà aspettare che l'exe-normale termini
> - termine exe-normale
> - il mini-exe scrive in coda all' exe-normale i dati [con le dovute
> considerazioni (cancella i vecchi dati, dimensione dei dati ecc ecc)]
> - il mini-exe, prima di terminare, elimina il file di appoggio che ha
> inglobato nell'exe-normale, riavvia l'exe-normale [magari con un parametro
> per poter dare un feedback adeguato all'utente] e segnala all'exe-normale
di
> eliminare il mini-exe...
>
> Un po' contorto ma efficace per poter salvare dati direttamente
nell'exe...

Contorto?? NOOOooo :))
No... ..allora, per fare un pó di chiarezza:
Non ci sono assolutamente problemi ad appendere dati ad un file eseguibile
anche durante il suo funzionamento, non grazie alla condivisione poiché l'ho
sempre fatto anche in Dos, i problemi si presentano quando si interagisce
con la collocazione dei blocchi del file nell'hard disk con ad esempio
operazioni di riscrittura o cancellazione. Ma "appendere" non da problemi.
Lo stesso vale per gli antivirus. Non si accorgono di niente proprio perché
l'eseguibile rimane immutato, provate pure a fare l'inoculazione!
Poi é chiaro che se il ragazzo doveva usare bmp o wav ecc fisse gli
conveniva usare le risorse ma non era questo il suo caso, e certo se i dati
non sono molti conviene usare il registry!
CIAO@@ :)

Ci tengo a dare un grande saluto ad Andrea Magni che insieme ad Alex
Martelli sono quelli che postando mi danno le idee migliori!

Antonio Tarolla

unread,
Dec 15, 1999, 3:00:00 AM12/15/99
to
Ciao Andrea,

Andrea Magni ha scritto:


>Ciao Antonio,
> le risorse possono essere utili se vuoi salvare un
>certo dato e mantenerlo costante nel tempo...


e io avevo capito proprio questo.
Ma perchè lui vuole modificare l' eseguibile mentre questo è in esecuzione
aggiungendo dei dati che interessano a lui ?
Allora se è così ho capito male !!

>Non credo si possa (tranne che sotto NT) scrivere a run-time le risorse di
>un altro Exe ma aspetto smentite... ;-)


In effetti il problema è complesso.
Comunque forse si può fare ma dovrei vedere bene l' help.
In pratica è possibile modificare l' exe a run-time utilizzando un exe
copia.
A questo punto bisognerebbe far in modo di dedicare una sezione dell' exe
alle risorse che ci interessano.
Logicamente questa sezione è statica e può essere solo modificata ma non
ampliata altrimenti l' exe diventa fasullo !!
Ora che mi hai detto che ho capito male mi hai messo questa pulce nell'
orecchio. Peccato che sono accupato ma appena mi libero voglio darci un'
occhiata !!

Ti saluto Andrea.
Ciaoooo !!!!

Antonio Tarolla


Andrea Magni

unread,
Dec 16, 1999, 3:00:00 AM12/16/99
to
Wayl <Wa...@mailcity.NOshpalm.com> wrote...

> Contorto?? NOOOooo :))
> No... ..allora, per fare un pó di chiarezza:
> Non ci sono assolutamente problemi ad appendere dati ad un file eseguibile
> anche durante il suo funzionamento, non grazie alla condivisione poiché
l'ho
> sempre fatto anche in Dos, i problemi si presentano quando si interagisce
> con la collocazione dei blocchi del file nell'hard disk con ad esempio
> operazioni di riscrittura o cancellazione. Ma "appendere" non da problemi.

Ciao Wayl,
non sapevo di quello che scrivi...
Mi pare plausibile ma fammi un esempio: con cosa ci scrivi? Se usi i
Pascal-files penso che la write fallisca (perchè il file è in
read-only,no?)...
Se usi gli stream forse... (non ho mai provato ma la cosa mi incuriosisce,
ci provo appena ho 5 minuti liberi...) :-)

Buono a sapersi comunque, può essere comodo... :-)

> Ci tengo a dare un grande saluto ad Andrea Magni che insieme ad Alex
> Martelli sono quelli che postando mi danno le idee migliori!

Ti ringrazio e ricambio, ma non penso che Alex sia troppo contento di essere
paragonato ad un ragazzino che smanetta un po' con l'API di Win32... ;-)
Seriamente, Alex è molto bravo, dubito che sia anche solo paragonabile con
me...
Tra l'altro su it.comp.programmareWin32 (dove penso tu abbia letto i msg di
Alex e i miei) trovi un sacco di persone molto + preparate di me (ad es.
Lorenzo Lutti o Ivanbrugh)

Wayl

unread,
Dec 16, 1999, 3:00:00 AM12/16/99
to
Andrea Magni <ama...@energy.it> wrote in message
94535534...@melissa.energy.it...
[...]

> Mi pare plausibile ma fammi un esempio: con cosa ci scrivi? Se usi i
> Pascal-files penso che la write fallisca (perchè il file è in
> read-only,no?)...
No. Questo é un esempio veloce, prova a compilarlo come file.exe
var f:text;
begin
assign(f,'file.exe');
append(f);
writeln(f,'Caspita, sto appendendo su me stesso');
close(f);
end.

Ho utilizzato il text, perché nei typed file non é implementato il metodo
append. Io so che utilizzando i file tipizzati questi possono essere anche
rewritati, e quindi non solo appesi ma anche modificati, purtroppo ció
comporta l'utilizzo del file di appoggio... veramente penso esistano limiti
(che non conosco) in questa seconda operazione. Non so che dirti di piú, ti
conviene fare tutte le prove che ti servono.
Programmando in c++ faccio uso e abuso delle classi fstream, che mi
permettono di fare pressoché qualsiasi cosa!

Per quanto riguarda le differenze tra te e gli altri non so, veramente non
ci credo molto a queste cose nel senso che ognuno é piú bravo degli altri in
qualche settore. I post tuoi e di Alex sono quelli che leggo con piú piacere
perché ultimamente sto cercando di dominare la piattaforma windows e le sue
classi demoniache, mi sto divertendo come non mai, ma ogni tanto capita di
bloccarsi, e questi ng mi danno un sacco di idee nuove per risolvere o
aggirare. Per quanto riguarda i guru non lo so, molti post non capisco
neanche se stiano parlando di programmazione :)
: Next (cosí ho citato anche il basic)


{MSX}

unread,
Dec 17, 1999, 3:00:00 AM12/17/99
to
Ho scoperto una cosa molto poco conosciuta: esiste una classe (TFiler) che
serve proprio a salvare dati binari nell'EXE. Viene tra l'altro usata dalla
VCL ad esempio per il TImage.
Dal momento che non ne ho mai sentito parlare, forse ho fatto una piccola
scoperta :o)

Peccato che sia difficile da usare come il male e che non sono ancora
riuscito a farlo funzionare del tutto... se Wayl o Andrea Magni volessero
favorire qui sotto posto il codice sorgente di un mio componente (ehm posso
postare codice vero ?) che dovrebbe poter "depositare" file binari
incapsulati nell'exe principale. Non badate se è incasinato, è che sto
tentando di fa funzionare il TFiler. Se a qualcuno interessa mi risponda
pure sul newsgroup che posso dare altre informazioni (non molte purtroppo)

CIAO ! {MSX}

http://gpi.eden.it/abc/delphi/

unit DeployerUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
dsgnintf;

type Dep_data=array of byte;
PDep_data=^Dep_data;


type
TDeployer = class(TComponent)
private
fsize:integer;
p:Pdep_data;
{ Private declarations }
protected
procedure DefineProperties(Filer: TFiler);override;
procedure ReadData(Stream:Tstream);
procedure WriteData(Stream:Tstream);
{ Protected declarations }
public
{ Public declarations }
procedure Deploy(FName:string);
Constructor Create(Aowner:Tcomponent);override;
published
property Size:integer read fsize;
{ Published declarations }
end;

Type TDeployerEditor = Class(tcomponentEditor)
procedure Edit; override;
end;

procedure Register;

implementation

Constructor TDeployer.Create(Aowner:Tcomponent);
begin
Inherited Create(Aowner);
p:=nil;
end;

procedure TDeployer.DefineProperties(Filer: TFiler);

function DoWrite: Boolean;
var
Ancestor: TDeployer;
begin
Ancestor := TDeployer(Filer.Ancestor);
if Ancestor <> nil then
Result := (p<>nil) and
(not CompareMem(ancestor.P, P ,size))
else Result := p <> nil;
end;

begin
Filer.DefineBinaryProperty('Data', ReadData, WriteData, DoWrite);
end;

procedure TDeployer.WriteData(Stream: TStream);
begin
Stream.WriteBuffer(p^,size);
end;

procedure TDeployer.ReadData(Stream: TStream);
begin
Stream.ReadBuffer(p^,size);
end;


procedure Tdeployer.Deploy(FName:string);
var f:file;
begin
assignfile(f,fname);
rewrite (f,1);
blockwrite(f,p^,size);
closefile(f);
end;

procedure TDeployerEditor.edit;
var open:TOpenDialog;
//f:TDeployerEditorForm;
s:tfilestream;
begin
open:=TOpenDialog.Create(self.component);
//f:=TDeployerEditorForm.Create(nil);
if open.execute then
begin
s:=TFileStream.Create(open.FileName,fmOpenRead);
if Tdeployer(self.Component).p<>nil then
freemem(Tdeployer(self.Component).p);
getmem(Tdeployer(self.Component).p,s.Size);

Tdeployer(self.Component).fSize:=s.size;
Tdeployer(self.Component).ReadData(s);

s.Free;
end;
open.free;

end;


procedure Register;
begin
RegisterComponentEditor(TDeployer,TDeployerEditor);
RegisterComponents('MSX', [TDeployer]);
end;

end.

Andrea Magni

unread,
Dec 18, 1999, 3:00:00 AM12/18/99
to
Wayl <Wa...@mailcity.NOshpalm.com> wrote...

> No. Questo é un esempio veloce, prova a compilarlo come file.exe

Non l'ho provato [il tempo manca sempre, tra l'altro tra poco esco (se vi
state chiedendo "Ma che ccavolo ci fai a casa sabato sera?")] ma ci credo
sulla fiducia :-)

> Ho utilizzato il text, perché nei typed file non é implementato il metodo
> append.

Penso che potresti usare una Seek al posto dell'append...

> Programmando in c++ faccio uso e abuso delle classi fstream, che mi
> permettono di fare pressoché qualsiasi cosa!

Mhmm... scommetto che non hai ancora dato un'occhiata alla classe
TFileStream (o in generale a TStream)... ;-)

0 new messages