PeekS & NextPackFile()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

PeekS & NextPackFile()

Beitrag von blbltheworm »

Hallo zusammen,
wenn ich

Code: Alles auswählen

  MemID=NextPackfile()
mache, dann wird die Datei ja in den Speicher entpackt.
Jetzt würde ich die Datei (Headerfile meines Packers) gerne auswerten.
Vereinfacht ist sie so aufgebaut:

1. Länge des Dateinamen (LenStr.w)
2. Dateiname (Str.s)

Jetzt hab ich eine Variable namens PeekPos.l, in der steht, an welcher Stelle ich weiterlesen muss.
Nach jedem Dateiname wird zu Peekpos 2+LenStr addiert, um zum nächsten Dateinamen zu gelangen.
Im Code sieht das dann so aus:

Code: Alles auswählen

PeekPos=0
MemID=NextPackFile()
;und das in die Schleife
LenStr=PeekW(MemID+PeekPos)
Str=PeekS(MemID+PeekPos+2,LenSTR)
PeekPos+2+LenStr
Das funktioniert auch einwandfrei, bis PeekPos>254 ist.
Dann kommt nur noch Müll.
Wenn ich mir die Datei auf die Festplatte entpacke und im Hexeditor betrachte müsste eingentlich alles funktionieren.
Es muss also am Code liegen.
Kann mir wer sagen, was ich falsch mache??
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Den Satz in der Hilfe zu NextPackFile(): "Die zurückgegebene 'Speicheradresse' wird geteilt ('shared') und sollte nie vom Programmierer freigegeben werden." hab ich noch nie verstanden, was bedeutet das?
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Beitrag von blbltheworm »

Hi,
ich glaub ich weiß jetzt, was die Hilfe damit meint.
Sie meint damit, dass der Speicher nicht reserviert ist und einfach so von einem anderen Programm überschireben werden kann.
Mit folgendem Code habe ich es zumindest geschaft mein Problem zu lösen:

Code: Alles auswählen

OpenPack(PackPath)
tmpMem=NextPackFile() ;Headerdatei in Speicher laden
HeaderSize=PackFileSize()
HeaderMem=AllocateMemory(HeaderSize)
CopyMemory(tmpMem, HeaderMem,HeaderSize)
Jetzt funktioniert es, da der Speicherbereich nicht einfach überschrieben wird.
Antworten