VB/VBA Bytes in Modulen speichern

Hallo Wissende,

ich habe mir im Zuge einer Anfrage im Excel-Brett ( /t/swf-in-excel/4897769/4

Der Code, gestartet mit „tt“ teilt eine Datei, hier eine swf, in der Arrayvariablen Block() in Häppchen von 64000 Bytes auf.

Der Sinn des Ganzen soll sein, egal Excel-Vba oder VB, daß die Bytes der Datei in Modulen „gespeichert“ werden.

Angenommen die swf-datei wurde in 9 Blöcke aufgeteilt. Jetzt würde ich gerne dafür zur Laufzeit des Codes 9 Module erstellen, in denen jeweils 64000 Bytes der Datei „gespeichert“ sind.

Das Modul 1 sollte dann ca. so aussehen:

Sub Prog1()
Dim Txt
Txt="…"
Txt=Txt & „…“
Txt=Txt & „…“
Txt=Txt & „…“
Txt=Txt & „…“
usw. bis in Txt die Bytes 1 bis 64000 der ehemaligen swf-Datei drin sind.

Danach soll eine Datei Neu.swf im Appendmodus geöffnet werden und im Append-Modus der Inhalt von „Txt“ angehängt werden.

End Sub

Wenn diese 9 Module erstellt sind brauche ich noch Code, der die Prozeduren der 9 Module nacheinander aufruft, so daß am Ende eine datei Neu.swf erstellt ist, ie ich dann im Flash-Player ablaufen lassen kann.

Falls das jetzt unverständlich war *gg*, bitte nachfragen.

Konkrete Fragen kann ich auch stellen.

a) Ich habe X Module mit den Namen mdl1 bix mdlX. Jedes Modul hat eine Prozedur mit dem Namen ProgX.
Wie sieht jetzt der Code aus, der nacheinander Prozedur Prog1 bis ProgX ausführt?

Prinzipiell brauche ich sowas:

For N = 1 to X
 Call "Prog" & N
Next N 

wobei das X auch erst zur Laufzeit bekannt ist.

Dankeschön für das Interesse
Gruß
Reinhard

Option Explicit
'Declare Sub CopyMemory Lib "kernel32.dll" \_
' Alias "RtlMoveMemory" ( \_
' Destination As Any, \_
' Source As Any, \_
' ByVal Length As Long)
Public txt As String, Block() As String
'
Sub tt()
Dim Dat As String, FF As Long, Platz As Long
Dat = "H:\europeanchampionship2008\europeanchampionship2008.swf"
FF = FreeFile
Platz = FileLen(Dat)
Open Dat For Binary As #FF
txt = Input(Platz, #FF)
Close #FF
Call Teilen(txt, 64000)
End Sub
'
Sub Teilen(ByVal txt As String, Laenge As Long)
Dim N As Long, NN As Long, Anz As Integer
For N = 1 To Len(txt) Step Laenge
 ReDim Preserve Block(Anz)
 Block(Anz) = Mid(txt, N, Laenge)
 Anz = Anz + 1
Next N
End Sub

Hallo Reinhard,

verstanden habe ich ‚Bahnhof‘. :smile:

Du hast eine große Datei, willst die in einem Rutsch laden, zerlegen und in ein Array schreiben.

Das hast Du gemacht, da sehe ich auch keinen Fehler, das soll so laufen.

Dann passiert damit vermutlich etwas und dann sollen die Daten wieder in die große Datei zurückgeschrieben werden. Warum Du da an Append denkst, ist mir nicht klar (warum nicht einfach ‚txt = Join(Arr, „“)‘: ?#ff, txt …?), aber das ist auch unwichtig, geht auch und dürfte für Dich kein Problem sein.

Aber was ist Deine Frage? Wo ist das Problem?

Gruß Rainer

Hallo Rainer,

verstanden habe ich ‚Bahnhof‘. :smile:

ach, du meinst das Gebäude wo die Bahnhofsuhr dranhängt? :smile:)

Du hast eine große Datei, willst die in einem Rutsch laden,
zerlegen und in ein Array schreiben.
Das hast Du gemacht, da sehe ich auch keinen Fehler, das soll
so laufen.

Angenommen, du hast eine beliebig große Datei. Gleichfalls hast du eine VB-Exe gebastelt, die beim Start mit dieser anderen Datei irgendetwas macht, in dem Fall als Flash abspielen aber das ist egal.
Dies geschieht dadurch daß du in der VB-Exe drin stehen hast, mache etwas mit der Datei xyz im Verzeichnis abc.

D.h., die VB-Exe funktioniert nur wenn die andere Datei auf einem Fremdrechner auch vorhanden ist.
Was also bedingt daß du an den Besitzer des Fremdrechners die VB-Exe Datei UND die andere Datei mailst o.ä.

Jetzt willst du aber an den Besitzer des FremdPCs nur eine VB-Exe schicken, OHNE die andere Datei.

Also muss ja die Byteinformation der anderen Datei in der VB-Exe drinstecken!
Damit dann die VB-Exe bei Aufruf aus diesen Bytes auf dem Fremdrechner eine Datei erstellt, die dann der weitere Code in der VB-Exe aufrufen kann, genauso wie wenn die andere Datei seperat mitgeliefert worden wäre.

Nun kann es ja sein, daß es in VB Möglichkeiten gibt, große Bytemengen mit in eine VB-Exe einpacken zu lassen.
Das entzieht sich meiner Kenntnis und würde mir auch nix helfen da Vba das garantiert nicht kennt.

Deshalb kam ich auf die Idee, die Bytes der anderen Datei in der VB-Exe in Modulen zu „parken“.
Jetzt glaube ich zu wissen, daß die Bytes eines Moduls auf 64 KB begrenzt sind, deshalb meine Aufteilung in Blöcke beim Einlesen der Bytes der anderen Datei.

Nachstehend ist Code, (leider noch Vba, kam noch nicht dazu das auf VB umzuschreiben :frowning: ), da wird dir das was ich mit „parken“ meine evtl. klarer. Gestartet wird er mit Aufruf von „ModuleErzeugen“
Anstatt der swf-Datei kann man natürlich jede beliebige Datei nehmen.

Nach Durchführung des Codes hat man dann paar Hundert neue Module, die jeweils immer nur eine Prozedur haben in diesem Muster:

Option Explicit

Function Prog3() As String
Prog3 = Prog3 & Chr(202)
Prog3 = Prog3 & Chr(162)
Prog3 = Prog3 & Chr(223)
Prog3 = Prog3 & Chr(93)
Prog3 = Prog3 & Chr(214)
Prog3 = Prog3 & Chr(97)

Usw.

End Function

Leider steigt der Erzeugungscode dieser Module bei/ab Modul 422 aus, warum ist mir leider noch unklar.

Das mal weglassend,wäre der Code durchgelaufen hätte ich aber das erreicht was ich will, in der VB(A) selbst sind die Bytes der anderen Datei „Geparkt“

D.h., u.a. mit deiner Hilfe *gg* ,hätte ich dann nur noch Code basteln müssen, der auf einem beliebigen FremdPC eine datei mit Open öffnet und dann nacheinander mit „Put“ erst Prog0, dann Prog1, usw in die Datei schreibt.

Ich hoffe sehr, ich konnte mich eben besser verständlich machen.

In Excel hätte ich ja die Option, die einzelnen Bytes der anderen Datei jeweils in eine Zelle zu schreiben und dann später diese Zellen auszulesen um damit eine Datei zu befüllen, das geht, habe ich getestet, ist aber grottenlangsam.

Und zu „Append“, das war falsch gedacht, solange eine Datei im Binary-Modus geöffnet ist, hängt put automatisch Bytes „an“, das wußte ich nicht als ich von „Append“ erzählte.

Gruß
Reinhard

Option Explicit
'Declare Sub CopyMemory Lib "kernel32.dll" \_
' Alias "RtlMoveMemory" ( \_
' Destination As Any, \_
' Source As Any, \_
' ByVal Length As Long)
Public txt As String, Block() As String, Anz As Integer
'
Sub ModuleErzeugen()
' Verweis auf Microsoft Visual basic for Applications Extensibility 5.3 setzen!
Dim N As Integer, NN As Long, vbComp As VBComponent, Zei As Long
Call ModuleLoeschen
'Exit Sub
Call tt
For N = 0 To UBound(Block)
 Set vbComp = ThisWorkbook.VBProject.VBComponents.Add(vbext\_ct\_StdModule)
 vbComp.Name = "mdlTeil" & N
 With vbComp.CodeModule
 .InsertLines .CountOfLines + 1, "Function Prog" & N & "() As String"
 For NN = 1 To Len(Block(N))
 .InsertLines .CountOfLines + 1, "Prog" & N & " = Prog" & N & " & Chr(" & Asc(Mid(Block(N), NN, 1)) & ")"
 Next NN
 .InsertLines .CountOfLines + 1, "End Function"
 End With
 Application.StatusBar = N & " / " & UBound(Block)
Next N
End Sub
'
Sub ModuleLoeschen()
Dim mdl As VBComponent
With ThisWorkbook.VBProject
 For Each mdl In .VBComponents
 If mdl.Name Like "mdlTeil\*" Then .VBComponents.Remove mdl
 Next mdl
End With
End Sub
'
Sub tt()
Dim Dat As String, FF As Long, Platz As Long
Dat = "H:\europeanchampionship2008\europeanchampionship2008.swf"
FF = FreeFile
Platz = FileLen(Dat)
Open Dat For Binary As #FF
txt = Input(Platz, #FF)
Close #FF
Call Teilen(txt, 1000)
End Sub
'
Sub Teilen(ByVal txt As String, Laenge As Long)
Dim N As Long, NN As Long
For N = 1 To Len(txt) Step Laenge
 ReDim Preserve Block(Anz)
 Block(Anz) = Mid(txt, N, Laenge)
 Anz = Anz + 1
Next N
End Sub

Hallo Reinhard,

ich habe mir im Zuge einer Anfrage im Excel-Brett (
/t/swf-in-excel/4897769/4
) den nachfolgenden Code gebastelt.

Der Code, gestartet mit „tt“ teilt eine Datei, hier eine swf,
in der Arrayvariablen Block() in Häppchen von 64000 Bytes auf.

Der Sinn des Ganzen soll sein, egal Excel-Vba oder VB, daß die
Bytes der Datei in Modulen „gespeichert“ werden.

Wieso zum Teufel in einem Modul ? Warum legst du sie nicht in einer Klasse ab?

Angenommen die swf-datei wurde in 9 Blöcke aufgeteilt. Jetzt
würde ich gerne dafür zur Laufzeit des Codes 9 Module
erstellen, in denen jeweils 64000 Bytes der Datei
„gespeichert“ sind.

Sodele das schreit wieder nach einer Klasse.
Erstelle doch einfach eine Klasse, wo du den Text speicherst. Dann erstelle halt eine Collection und füge dort die Member hinzu. Hierbei spielt es keine Rolle wieviele es sind.

Das Modul 1 sollte dann ca. so aussehen:

Sub Prog1()
Dim Txt
Txt="…"
Txt=Txt & „…“
Txt=Txt & „…“
Txt=Txt & „…“
Txt=Txt & „…“
usw. bis in Txt die Bytes 1 bis 64000 der ehemaligen swf-Datei
drin sind.

Das verstehe ich nicht wirklich :frowning:
Aber schau mal… du erstellst eine Klasse „Data“ Dort gibt es eine Eigenschaft txt(String) Dieser kann den String speichern. Dann hast du dort eine Sub / Function implementiert die dir den Text bearbeitet.
Dann erstellst du eine Klasse wo du eine Collection bildest. Dieser Klasse fügst du die Function Add, Die Eigenschaft Count und Item. Vielleicht auch noch eine Methode Remove zum entfernen des Member aus der Collection hinzu und das war es schon.
Du traegst dann einfach in der Collection den Text ein. So oft wie du magst. Mittels der Item Eigenschaft kannst du gezielt auf einen Member zugreifen und ergo dort dann den speziellen Text auslesen oder auch eine Methode ausführen. Das hört ziemlich schwer an. Reinhard ist es aber nicht. Das Demo zeigt dir das :wink:

Danach soll eine Datei Neu.swf im Appendmodus geöffnet werden
und im Append-Modus der Inhalt von „Txt“ angehängt werden.

Das könnte man in der Collection Klasse dann realisieren.

Wenn diese 9 Module erstellt sind brauche ich noch Code, der
die Prozeduren der 9 Module nacheinander aufruft, so daß am
Ende eine datei Neu.swf erstellt ist, ie ich dann im
Flash-Player ablaufen lassen kann.

Siehst und du musst so nur die Collection durchlaufen und dann in jeder Klasse den Txt abrufen oder die Methode ( je nachdem was du magst)

Falls das jetzt unverständlich war *gg*, bitte nachfragen.

Konkrete Fragen kann ich auch stellen.

a) Ich habe X Module mit den Namen mdl1 bix mdlX. Jedes Modul
hat eine Prozedur mit dem Namen ProgX.

Diese Prozedur könntest du in die Klasse legen und dann einfach ueber die Collection mittels der Item Eigenschaft darauf zugreifen :wink:

Wie sieht jetzt der Code aus, der nacheinander Prozedur Prog1
bis ProgX ausführt?

Einfach die Collection durchlaufen und die Methode aufrufen!

wobei das X auch erst zur Laufzeit bekannt ist.

Siehst und das ist das schoene bei einer Collection. Das interessiert uns doch garnicht *grins*

So aber nun mal ein kleines Demo

'Klasse Data 
'Hier werden die Daten gespeichert und modifiziert. Sprich hier 
'muessen saemtliche subs rein :wink:

Option Explicit

Private MyText As String

Public Property Get Txt() As String
 Txt = MyText
End Property

Public Property Let Txt(ByVal vNewValue As String)
 MyText = vNewValue
End Property

Public Sub ProgX()
'hier dein source dann, sollte ja 9 mal der selbe sein \*gg\*
End Sub

Private Sub Class\_Initialize()
 MyText = ""
End Sub


'Klasse ColData
'Die Klasse die die Collection erstellt 

Option Explicit

Private mCol As Collection

Private Sub Class\_Initialize()
 Set mCol = New Collection
End Sub

Private Sub Class\_Terminate()
Set mCol = Nothing
End Sub

Function Add(Txt As String) As Data
Dim ObjMember As Data
Set ObjMember = New Data
With ObjMember
 .Txt = Txt
End With
mCol.Add ObjMember
Set Add = ObjMember
Set ObjMember = Nothing
End Function

Public Property Get Item(ByVal Index As Long) As Data
 Set Item = mCol(Index)
End Property

Public Property Get Count() As Long
 Count = mCol.Count
End Property

Allein mit diesen 2 Klassen kommst du an das Ziel. Du musst nur deinen Source in der sub ProgX schreiben :wink:

Zugreifen koenntest du nun via

Option Explicit

Private Sub Form\_Load()
Dim x As ColData
Dim I As Long
Set x = New ColData
x.Add ("Reinhard")
x.Add ("Rainer")
x.Add ("Alex")
For I = 1 To x.Count 'Collection ist nicht Null basierend!!!
 x.Item(I).ProgX 'Wir rufen jedesmal die Sub Progx auf
 'x.Item(I).Txt 'Wenn wir die Daten in txt brauchen :wink:
Next
End Sub

MfG Alex

PS: Willkommen in der Welt der OOP :smiley:

Hallo Reinhard,

ahhh, es wird heller in meinem Kopf. Das ist zwar immer noch eine Glimmlampe, aber immerhin … :smile:

Jetzt willst du aber an den Besitzer des FremdPCs nur eine
VB-Exe schicken, OHNE die andere Datei.

Also muss ja die Byteinformation der anderen Datei in der
VB-Exe drinstecken!

Richtig.

Damit dann die VB-Exe bei Aufruf aus diesen Bytes auf dem
Fremdrechner eine Datei erstellt, die dann der weitere Code in
der VB-Exe aufrufen kann, genauso wie wenn die andere Datei
seperat mitgeliefert worden wäre.

Nun kann es ja sein, daß es in VB Möglichkeiten gibt, große
Bytemengen mit in eine VB-Exe einpacken zu lassen.
Das entzieht sich meiner Kenntnis und würde mir auch nix
helfen da Vba das garantiert nicht kennt.

Doch, das machst Du ständig. Bilder! In VB ist es ja auch nicht schwer, die Bilder in Bytes umzuwandeln und umgekehrt. Mit VBA haben wir das ja neulich erst versucht … :frowning:

Deshalb kam ich auf die Idee, die Bytes der anderen Datei in
der VB-Exe in Modulen zu „parken“.
Jetzt glaube ich zu wissen, daß die Bytes eines Moduls auf 64
KB begrenzt sind, deshalb meine Aufteilung in Blöcke beim
Einlesen der Bytes der anderen Datei.

Du willst per Code so etwas mit der Endung .bas schreiben:

Attribute VB\_Name = "Module1"
Text = "32,32,32,65,66,67,68,"
Text = Text + "69,70,71,72,"

Und dann in den Quellcode einbinden. OK. Wenig effektiv, aber geht.
Den Umweg über Zahlen musst Du gehen, weil du ja Binärdaten sichern willst, die bekommst Du anders nicht in den Quellcode. Du musst also für ein Byte Daten vier Bytes Text im Code halten.

Habe ich bis hier her richtig verstanden? Damit VB das richtig kompiliert würde ich die Zeilen nicht zu lang machen …

Nachstehend ist Code, (leider noch Vba, kam noch nicht dazu
das auf VB umzuschreiben :frowning: ), da wird dir das was ich mit
„parken“ meine evtl. klarer. Gestartet wird er mit Aufruf von
„ModuleErzeugen“
Anstatt der swf-Datei kann man natürlich jede beliebige Datei
nehmen.

Nach Durchführung des Codes hat man dann paar Hundert neue
Module, die jeweils immer nur eine Prozedur haben in diesem
Muster:

Option Explicit

Function Prog3() As String
Prog3 = Prog3 & Chr(202)
Prog3 = Prog3 & Chr(162)
Prog3 = Prog3 & Chr(223)
Prog3 = Prog3 & Chr(93)
Prog3 = Prog3 & Chr(214)
Prog3 = Prog3 & Chr(97)

Usw.

End Function

Leider steigt der Erzeugungscode dieser Module bei/ab Modul
422 aus, warum ist mir leider noch unklar.

Hmmm. Das sind doch nur Textdateien, davon müsstest Du unbegrenzt viele auf die Platte schreiben können, wenn Platz ist. Wie viele man einbinden kann weiß ich aber nicht.

Das mal weglassend,wäre der Code durchgelaufen hätte ich aber
das erreicht was ich will, in der VB(A) selbst sind die Bytes
der anderen Datei „Geparkt“

D.h., u.a. mit deiner Hilfe *gg* ,hätte ich dann nur noch
Code basteln müssen, der auf einem beliebigen FremdPC eine
datei mit Open öffnet und dann nacheinander mit „Put“ erst
Prog0, dann Prog1, usw in die Datei schreibt.

Ich hoffe sehr, ich konnte mich eben besser verständlich
machen.

Ich glaube ja. :smile:

In Excel hätte ich ja die Option, die einzelnen Bytes der
anderen Datei jeweils in eine Zelle zu schreiben und dann
später diese Zellen auszulesen um damit eine Datei zu
befüllen, das geht, habe ich getestet, ist aber
grottenlangsam.

Was ich da jetzt im Kopf habe funktioniert auch nur, wenn Du Byte für Byte mit CStr(Asc(Mid …))) in eine Zahl verwandelst und mit Trennzeichen in die Textdatei schreibst. Schnell wird das auch nicht. Vor allem wird das riesengroß, weil Du für 1MB Daten etwa 5MB Programm brauchst.

Programmieren schaffe ich heute nicht mehr, fürchte ich.
Aber willst Du tatsächlich eine so riesige Exe erzeugen, nur damit Du nur eine Datei hast? Wenn es um VB6 geht, da kannst Du ohnehin nicht nur eine einzelne .exe weitergeben, VB6-Programme müssen installiert werden!

Gruß Rainer

AAAh,

nun hat es bei mir auch bing gemacht.
Warum macht ihr euch das so umstaendlich?

Look at here http://www.vb-fun.de/vb/tipps/tip0483.shtml

weil ich zu faul bin um selber zu schreiben *gg*

Einziges Hinderniss ist, das man nur 64KB speichern kann pro Ressource.
Aber was spricht dagegen mehrere einzupflegen und diese dann auszulesen und zusammen zu setzen :wink:

MfG Alex

Hi Alex,

ja, fast. :smile: Reinhard sucht eine Lösung, die in VB5 und VBA funktioniert. Das Ergebnis muss also Quellcode sein, kein Kompilat.

Gruß Rainer

Hallo Rainer,

na das ist ja nen schöner Mist :frowning:

Aber dann lass uns mal weiter übelegen!

So spantan was keine schoene Variante ist aber funktionieren sollte, ist einfach eine Dummy Form zu erstellen. Die Datei einlesen ,
Blöcke erstellen. Dann dynamisch einfach so viele Textboxen erstellen wie es blöcke gibt. Dann die Daten vom Block einfach der text Eigenschaft zuweisen. Danach!!! das Project compilieren ( unter VB) und dann ausliefern. Beim starten dann die Textboxen , da sie indiziert sind alle aufrufen und die Daten auslesen und das File schreiben!
Sollte eigentlich funktionieren!

MfG Alex

Hi Alex,

Aber dann lass uns mal weiter übelegen!

OK. :smile:

So spantan was keine schoene Variante ist aber funktionieren
sollte, ist einfach eine Dummy Form zu erstellen. Die Datei
einlesen ,
Blöcke erstellen. Dann dynamisch einfach so viele Textboxen
erstellen wie es blöcke gibt. Dann die Daten vom Block einfach
der text Eigenschaft zuweisen.

hmmm. Gibt das keine Probleme mit Bytes, die nicht als Zeichen darstellbar sind? Es geht ja um Binärdaten. Kann man die so einfach in einer Textbox ablegen? Das soll ja auch mit VBA funktionieren, also kein RTF nehmen. :smile:

Ich würde tatsächlich Zahlenkolonnen schreiben, so kompliziert ist ein Modul ja nicht aufgebaut, das kann man leicht per Code schreiben.

In VB würde ich die Daten einfach als Grafik in eine Picturebox legen. GetBitmapBits und die Daten sind in einem Bytearray. :smile: Aber das geht ja nicht mit VBA. :frowning:

Gruß Rainer

Hallo Rainer,

*********************************************************************************
Programmieren schaffe ich heute nicht mehr, fürchte ich.
Aber willst Du tatsächlich eine so riesige Exe erzeugen, nur damit Du nur eine Datei hast? Wenn es um VB6 geht, da kannst Du ohnehin nicht nur eine einzelne .exe weitergeben, VB6-Programme müssen installiert werden!
*********************************************************************************

? was ist denn das für ein Schrott?
Ich dachte bisher, du schickst mir z.B. eine VB6-Exe und die läuft ohne daß ich da was installieren muß?

Wenn das nicht so ist kommt meine VB5 CD in die Tonne und ich suche in alten Disketten nach qbasic, da hatte ich mal eine enlische Version, die konnte exe Dateinen erstellen die alleine auf Fremdrechnern liefen.
Naja, ob die Disketten noch lesbar sind, abgesehen brauche ich dazu erstmal einen Rechner der noch Diskettenlaufwerke hat.

Und damit die Uhr am Bahnhof stärker strahlt :-=

Du hast eine VB-Exe die du an FremdPCs verteilst und die im Code hat:

x=shell(„c:\test\Loeschediefesttplatte.exe“,6)

Damit das klappt, müßte ja in c:\test diese Datei vorhanden sein

Wie also machst du es damit der Code trotzdem klappt, auch auf FremdPCs?

Der Code kann ja nur klappen wenn die Datei existiert.

Also muß man sie in dem Verzeichnis erzeugen.

Damit sie auch funktioniert braucht sie Bytes,

Wie also speichere ich die benötigten Bytes im Code der Vb-Exe ab um dann bei Aufruf eine datei mit diesen Bytes zu füllen?

Die Antworten von Alex und deine muß ich erstmal auswerten, eher morgen.

Gruß
Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Reinhard,

? was ist denn das für ein Schrott?
Ich dachte bisher, du schickst mir z.B. eine VB6-Exe und die
läuft ohne daß ich da was installieren muß?

*gg* Wenn der Empfänger auch VB6 installiert hat und alle OCXe hat, die Du eventuell selbst gebaut hast, gibt es eine gewisse Chance, daß es läuft. Sonst: Verpackungs und Weitergabeassistent, Verpacken und der Empfänger installiert das Paket.

Wenn das nicht so ist kommt meine VB5 CD in die Tonne und ich
suche in alten Disketten nach qbasic, da hatte ich mal eine
enlische Version, die konnte exe Dateinen erstellen die
alleine auf Fremdrechnern liefen.
Naja, ob die Disketten noch lesbar sind, abgesehen brauche ich
dazu erstmal einen Rechner der noch Diskettenlaufwerke hat.

Und damit die Uhr am Bahnhof stärker strahlt :-=

Du hast eine VB-Exe die du an FremdPCs verteilst und die im
Code hat:

x=shell(„c:\test\Loeschediefesttplatte.exe“,6)

Damit das klappt, müßte ja in c:\test diese Datei vorhanden
sein

Wie also machst du es damit der Code trotzdem klappt, auch auf
FremdPCs?

Der Code kann ja nur klappen wenn die Datei existiert.

Also muß man sie in dem Verzeichnis erzeugen.

Die legt man dann per Installer in den selben Pfad wie die eigentliche .exe und den bekommt man ja mit App.Path.

Damit sie auch funktioniert braucht sie Bytes,

Wie also speichere ich die benötigten Bytes im Code der Vb-Exe
ab um dann bei Aufruf eine datei mit diesen Bytes zu füllen?

Wieder so. Du kannst mit dem Installer mehr als nur die .Exe mitgeben und die Daten liegen dann im selben Pfad wie die .exe.
Es gibt keinen Grund die Daten mit der Exe erst zu erzeugen.

Ich habe doch noch meinen Code geschrieben, der erst mal nur ein Modul erzeugt:

'Grafik laden, in Modul schreiben
Private Sub Command1\_Click()
 Dim ff As Integer, na As String, txt As String
 Dim i As Long, j As Integer
 na = "C:\Test.bmp"
 ff = FreeFile
 txt = Space(FileLen(na))
 Open na For Binary As #ff
 Get #ff, , txt
 Close #ff
 na = "C:\Module1.bas"
 ff = FreeFile
 Open na For Output As #ff
 Print #ff, "Attribute VB\_Name = " + """" + "; Module1;" + """"
 Print #ff, "Public Txt2 As String"
 Print #ff, ""
 Print #ff, "Public Sub MS()"
 For i = 1 To Len(txt) Step 20
 Print #ff, "Txt2 = Txt2 + " + """";
 If Len(txt) - i \>= 20 Then
 For j = 0 To 19
 Print #ff, CStr(Asc(Mid(txt, i + j, 1)));
 Print #ff, "|";
 Next
 Else
 For j = 0 To Len(txt) - i
 Print #ff, CStr(Asc(Mid(txt, i + j, 1)));
 Print #ff, "|";
 Next
 End If
 Print #ff, """"
 Next
 Print #ff, "End Sub"
 Close #ff
End Sub

'Daten aus Modul als Grafik speichern
Private Sub Command2\_Click()
 Dim ff As Integer, na As String, txt As String, arr() As String, i As Long
 ff = FreeFile
 na = "C:\Bild.bmp"
 MS
 arr = Split(Txt2, "|")
 Open na For Output As #ff
 For i = LBound(arr) To UBound(arr)
 Print #ff, Chr(Val(arr(i)));
 Next
 Close #ff
End Sub

Gruß Rainer

Hallo Alex,

Der Sinn des Ganzen soll sein, egal Excel-Vba oder VB, daß die
Bytes der Datei in Modulen „gespeichert“ werden.

Wieso zum Teufel in einem Modul ? Warum legst du sie nicht in
einer Klasse ab?

warum setze ich mich in jedes Auto und kann losfahren, bei Hubschraubern klappt das nicht so ganz *grins*
Liegt irgednwie doch am Können/Wissen…

Angenommen die swf-datei wurde in 9 Blöcke aufgeteilt. Jetzt
würde ich gerne dafür zur Laufzeit des Codes 9 Module
erstellen, in denen jeweils 64000 Bytes der Datei
„gespeichert“ sind.

Sodele das schreit wieder nach einer Klasse.

Das mit den 9 Modulen kam von mir, ich hatte da was im Ohr daß man nur 64 KB in ein Modul packen kann. Wenn diese Grenze nicht gilt, braucht man auch keine 9 Teile.
Und daher kam auch mein Append-gedanke, kann also auch entfallen.

Eingelesen werden die Bytes einer beliebigen Binärdatei so:

Option Explicit
Public txt As String

Sub tt()
Dim Dat As String, FF As Long, Platz As Long, N
Dat = „H:\europeanchampionship2008\europeanchampionship2008.swf“
FF = FreeFile
Platz = FileLen(Dat)
Open Dat For Binary As #FF
txt = Input(Platz, #FF)
Close #FF
End Sub

(Wahrscheinlich ist „Public txt As String“ schon der erste Fehler bei Binärdateien.)
Die Beispieldatei hat jetzt ca. 500.000 Bytes, aber das ist egal, eine Lösung soll ja für jede beliebig große Binärdatei gelten.

Und um meine Vba-Problematik mal nach VB zu übersetzen.

Du hast eine große Exe.Datei, zur Not die Installations-Exe von Open Office (149MB), vielleicht noch die Installationsdatei für Winamp usw.

Nun willst du einem Kunden eine VB-Exe basteln, die nacheinander die anderen Exe-dateien mit z.B. Shell startet.
jetzt will dein Kunde aber nicht viele dateien geschickt bekommen sondern einzig eine Exe, deine VB-Exe.

Ergo mußt du alle Bytes der anderen Dateien irgendwo/irgendwie mit in deine VB-Exe reinschaufeln.

Dann muß die VB-Exe beim Kunden die anderen Dateien wieder erstellen und dann starten.

Ich hoffe sehr, du und Rainer u u.a. können meine Fragen jetzt besser einsortieren.

Jetzt hast du mir netterweise Code gebastelt, danke.
leider stehe ich noch sehr auf dem Schlauch wie ich den benutze um

a) viele Bytes im Code einer VB-Exe unterzubringen.

b) wie ich die dann wieder schnell auslese um sie mit Put in eine Datei zu schreiben um diese dann starten zu können.

PS: OOP muß noch warten, ich hänge noch an OO sehr fest, das P kommt später :smile:
OO=OpenOffice, mannomann eine völlig andere Programmierwelt.
Naja, „Helle world“ auf den Bildschirm zu zaubern schaffte ich schon *gg*

Danke & Gruß
Reinhard