Speichern in der Exe

Eyewitness

Erfahrenes Mitglied
Also, folgendes Problem:
Ich will mir ne kleine Exe Datei machen, die beim Aufruf eine Form aufruft, in der man lustig Sachen eintragen kann, die man sich irgendwie merken will, etc. Klar, kann man mit einer Datenbank machen, darum geht's aber nicht. Sondern es geht um das Problem, daß beim Schließen der Anwendung die Eintragungen gelöscht werden. Wie kann man dieses Löschen verhindern, so daß eingegebene Daten gespeichert werden in der Exe selbst und nicht in einer externen Datei, bzw. geht das überhaupt?

Bin für jede Hilfe dankbar!
 

Celvin

Mitglied
Moin Eye du Braten...
Joa, geht scho, kannst so ziemlich alles an das Ende der Exe anhängen, das macht der nicht wirklich viel...
Schreibst halt nen kleinen Header mitn paar Offsets und dann die Daten...
 

Eyewitness

Erfahrenes Mitglied
*brutzel*

Stell Dir vor, Du hast einen totalen VB Newbie vor Dir und der guckt Dich jetzt ganz doof an mit einem gigantischen "Hä?" auf seinem Gesicht. ;)
 

Daniel Toplak

Erfahrenes Mitglied
Also sorry. Aber ich würde das nicht machen. Natürlich ist es möglich etwas in eine .exe reinzuschreiben, aber ob danach noch dein Programm korrekt funktioniert, ist sehr fraglich. Denn eine .exe ist kompilierter Maschienen-Code und nicht dazu da um irgendwelche Daten reinzuschreiben.
Warum machst du es dir net einfacher und schreibst die Sachen, die du speichern willst einfach in eine Datei weg und zwar z.B. beim Beenden der Anwendung. Beim Starten lädst du dann die Daten einfach wieder und schwups is alles wieder da *g*.

P.S. für Dateivararbeitung gibt es in der MSDN zig Beispiele, ich empfehle aber das FileSystemObject zu nehmen, denn da hast du mehr Möglichkeiten als auf die "alte" Methode.

Grudd Homer
 

Celvin

Mitglied
Studier mal das PE-Format, dann sollte dir schon klar werden, dass es durchaus möglich ist, eine Menge Krempel ans Ende einer ausführbaren Datei anzufügen, da diese Daten dann einfach ignoriert werden...

Und Eye, ich weiß noch wer du bist ;)

Ich rate dir zwar auch davon ab(macht ja auch net grad viel Sinn), was ich meinte ist jedoch ein Header, indem zum einen
die Art der Daten stehen,die Länge, und das Offset, also die Position in der Datei...als Text könnte das so aussehen:

FTYPEJPG-345645489-362732673

Dann weiß dein Tool dass es an von Position 362732673 einfach nur noch 345645489 Bytes auslesen muss, und dass dabei ein .jpg File rauskommt...
 

Eyewitness

Erfahrenes Mitglied
Na klar, eigentlich isses ja auch blöd, aber es geht darum, daß ich ned ständig mehrere Dateien hin und herschieben will. Mit einer einzigen Datei wäre es schon einfacher...

Wie auch immer, danke für die Infos, ich werd sehen, was ich tun kann. ;)

Und Celvin, ich hab echt keinen Plan, wer Du bist... *rätsel*
 

Celvin

Mitglied
Nochn paar Anregungen:

Wenn du ne Datei im "Binary" Modus öffnest, kannst du mit:

Get #Nummer,<Position>,Variable
Put #Nummer,<Position>,Variable

An die durch den 2. Parameter angegebene Position nen Wert schreiben und lesen...

P.S.: Ich bin 57R470R, rofl...
 

Eyewitness

Erfahrenes Mitglied
Oh Gott, nicht der alte.....*schluck*

Da wollte ich mich vor Dir verstecken und dann klappt's doch ned....

Naja, trotzdem danke für die Infos. ;)
 
C

CodeXP

re: Daten in EXE Speichern

Hy,

da ich sowas schon mal mit QuickBasic gemacht habe,
(weil man nicht auf Registry zugreifen kann mit dos anwendungen)
möchte ich hier mal beschreiben wie das geht:

Also mein Problemm war halt Serial Key, als eine TextDatei die Serial Nummer zu speichern ist wirklich ne schlechte Idee, deswegen habe ich eine Methode erfunden wie man sowas in einer EXE speichert!

Diese Methode ist eben für sowas kleines, nicht das jemand denkt dass man ganzen Lebenslauf so speichern könnte.

Dabei wird die EXE datei nicht beschädigt!

Als Erstes: Definiert man zwei Variablen als STRING, und andere..

------
Dim OFFSET as String
Dim AAData as String
Dim Buffer as String
Dim Adresse as Long
Dim FNr as Integer
------

jetzt füllen wir die Variablen:

------
OFFSET = "#012345" ' 6 Zeichen sollten wirklich reichen!
AAData = "qaywsxedcrfvtgbzhnujmikolp" ' 26 Zeichen für data
------

bei OFFSET Sollte erster zeichen "#" sein! um zu prüfen ob die Adresse gesezt wurde! Und es ist wichtig das bei der Variable AAData Verschiedene Zeichen stehen damit es nicht von Compiler gepackt wird!
Ja, da gibts ein Problemm: Die EXE Datei darf nicht gepackt werden! Ansonsten wird die beschädigt!
Nun brauchen wir ein inteligentes Code was erkennen kann ob die OFFSET (Adresse in der Datei) schon gesezt wurde oder nicht

------
If Left(AAData, 1) <> "#" then
Adresse = Val(AAData)
End If

...
' String Anzeigen:
MsgBox AAData
...
------

das war's schon mit der inteligenz!

also den String braucht man nicht zu laden, der ist automatisch in der Variable AAData!

Ok nun sind wir an der Stelle wo wir was in die EXE rein schreiben wollen:
wir schreiben mal die Uhrzeit in die EXE Datei..

------
...

' Buffer darf nicht länger als AAData sein sonst
' zerstören wir die EXE Datei!
Buffer = Time ' oder was anderes halt

' jetzt prüfen wir die länge:
If Len(Buffer) > Len(AAData) Then
Buffer = Left(Buffer, Len(AAData))
End If
' rest mit Leerzeichen füllen
If Len(Buffer) < Len(AAData) Then
Buffer = Buffer & String(Len(AAData)-Len(Buffer), chr(32))
End if


If Adresse>0 Then
FNr = FreeFile
' Speichern in EXE:
Open MyEXEName for binary as FNr
Put #FNr, Adresse, Buffer
Close FNr
' gespeichert!
End If
------

Bevor das Programm funktionieren kann muss es Kompiliert werden, und die Offset-Adresse gesetzt werden!

Hier dazu benötigte Functions:
------
Private Function MyPath() AS String
MyPath = iif(right(App.Path, 1) = "\", App.Path, App.Path & "\")
End Function

private Function MyEXEName() As String
MyEXEName = MyPath & App.EXEName & ".exe"
End Function
------

Wie?
Also zuerst kompilieren, danach die Datei mit einem HEX-Editor öffnen und den Inhalt der Variable AAData suchen, in diesem Fall wäre es "qaywsx"... also nach "qaywsx" suchen. Die Adresse an welcher der String beginnt merken!
Achting! Hexedezimale Zahlen sind nicht Dezimale Zahlen also zuerst mit dem Calc Umwandeln!
Jetzt den anderen String, aus der Variable OFFSET, suchen, also bei uns "#012345".
Nun diesen string ("#012345") durch die Adresse die wir uns gemerkt haben ersetzen, und zwar so dass am anfang nullen stehen!
Zum Beispiel ist die Offset Adresse = 1267, der OFFSET String vorher: "#012345" und nacher "0001267", also "#" auch ersetzen, sost denkt unser Programm dass die Adresse immer noch nicht gesetzt wurde!

Nun das Programm starten, und sehen ob das funzt :>


Ob der Source hier funzt hab ich keine Ahnung. Ich habe das ganze "on the fly" geschrieben, nicht mal getestet!
Es ist nur eine Theorie.
Der Rest bleibt Euch überlassen!

und bidde Mailt mir Falls es wirklich gefunzt hat!
 

Sinac

Erfahrenes Mitglied
Hierm, ich weiß zwar nich ob das für dich ne denkbare lösung is, aber wenn ich nur eine Datei haben möchten und trotzdem werde specihern will, speicher ich die werte imma in die Registry! Funzt na klar nur auf diesem einem Rechner, aber kannst dir ja n kleine "Exportfunktion" einbaun um das ganze dann für der "Transport" auf nen anderen Rechner in ne Terxtdate zwischen zu lagern...
verstehste?