zlib.lib entpackt nicht unter Windows 7 x64? [gelöst]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

zlib.lib entpackt nicht unter Windows 7 x64? [gelöst]

Beitrag von Kukulkan »

Hallo,

ich ziehe mit ImportC "zlib.lib" die zlib Funktionen rein. Ich entpacke dann mit folgender Routine (aus dem Forum von ts-soft):

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    ImportC "/usr/lib/libz.a"
  CompilerCase #PB_OS_Windows
    ImportC "zlib.lib"
CompilerEndSelect
  compress2(*dest, *destLen, *source, sourceLen, level)
  uncompress(*dest, *destLen, *source, sourceLen)
EndImport

Procedure zipUnpackMemory(*source, *dest)
  Protected sourceLen = MemorySize(*source)
  Protected destLen = MemorySize(*dest)

  If Not uncompress(*dest, @destLen, *source, sourceLen)
    ProcedureReturn destLen
  EndIf
EndProcedure
Das klappt auch unter allen x86 Systemen (32 Bit). Unter Windows 7 mit x64 klappt es aber nicht. Leider bekomme ich nicht mit warum. Eine ausführliche Untersuchung mit dem Sysinternals ProcessMonitor hat keine fehlenden DLLs oder sowas ergeben.

Ich verwende PB 4.51 und mache ein 32 Bit Executable. Das sollte doch unter x64 auch gehen, oder?

Was kann das sein?

Kukulkan
Zuletzt geändert von Kukulkan am 25.05.2011 18:59, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: zlib.lib entpackt nicht unter Windows 7 x64?

Beitrag von ts-soft »

Das liegt wohl an Deinem hier nicht sichtbaren Code :mrgreen:

Code: Alles auswählen

EnableExplicit

; Autor: Thomas (ts-soft) Schulz
; PB-Version: 4.xx
; OS: windows/linux/MacOS

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    ImportC #PB_Compiler_Home + "purelibraries/linux/libraries/zlib.a"
CompilerCase #PB_OS_MacOS
  ImportC "/usr/lib/libz.dylib"
  CompilerCase #PB_OS_Windows
    ImportC "zlib.lib"
CompilerEndSelect
  compress2(*dest, *destLen, *source, sourceLen, level)
  uncompress(*dest, *destLen, *source, sourceLen)
EndImport

Procedure zipPackMemory(*source, sourceLen = #PB_Default, level = #PB_Default)
  Protected *dest, destLen
  
  If level < #PB_Default Or level > 9 : level = #PB_Default : EndIf
  If *source
    If sourceLen = #PB_Default : sourceLen = MemorySize(*source) : EndIf
    destLen = sourceLen + 13 + (Int(sourceLen / 100))
    *dest = AllocateMemory(destLen)
    If *dest
      If Not compress2(*dest, @destLen, *source, sourceLen, level)
        *dest = ReAllocateMemory(*dest, destLen)
        ProcedureReturn *dest
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure zipUnpackMemory(*source, *dest)
  Protected sourceLen = MemorySize(*source)
  Protected destLen = MemorySize(*dest)

  If Not uncompress(*dest, @destLen, *source, sourceLen)
    ProcedureReturn destLen
  EndIf
EndProcedure

Define.s Text = "Feel the ...Pure... Power"
Define.i Length = StringByteLength(Text)
Define *packed = zipPackMemory(@Text, Length)
Define *unpacked = AllocateMemory(Length)
Define.i newLenght = zipUnpackMemory(*packed, *unpacked)
Debug PeekS(*unpacked, newLenght)
Funktioniert mit x86 und x64 ohne Probleme!

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: zlib.lib entpackt nicht unter Windows 7 x64?

Beitrag von Kukulkan »

Hallo,

Problem gefunden! Unter 32 Bit Windows erkennt zLib das Ende des ZIP Bereiches im Memory, auch wenn hintendran noch Daten im Speicher sind (also wenn ich nur 1KB ZIP-Daten hab und der an uncompress übergebene Memory-Bereich aber 2KB hat). Unter x64 hat es das nicht getan. Wenn ich nun explizit die korrekte Eingabelänge vorgebe (1KB im Beispiel), dann klappt es.

Ganz klar mein Verschulden. Unglaublich nur, dass das unter 32 Bit problemlos gegangen ist.

Danke trotzdem an alle Helfer :)

Kukulkan
Antworten