PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: zwischen Frage AES als Datei Container zu verwenden

Beitrag von ChrigiGee »

Hallo jacdelad,

Danke für Deine Anregung, Dann eröffne ich einen Eigenen Thread für das ganze mit dem AES.
Und wegen deinem Einwand, mit dem HEX und der Formatierung.

Gemäss Bespiel, vor dem Wert ein "$" Zeichen danach ein "," das meinte ich mit Formatierung.
Aber dafür eröffne ich einen Eigenen Thread zum Diskutieren...

Liebe Grüsse
Christian
jacdelad hat geschrieben: 30.07.2024 23:26
ChrigiGee hat geschrieben: 30.07.2024 22:57 aber da der Key im Beispiel eine gewisse Formatierung voraussetzt
Der Key selbst setzte keine Formatierung voraus. Der Key im Beispiel ist 16 Byte lang, ob du die als einzelne Byte im Code hinterlegst, oder 4 Longs benutzt, oder einen Speicherbereich mit der Größe 16 Byte ist unerheblich. Du kannst auch einen größeren Speicherbereich benutzen und die Adresse entsprechend verschieben, usw...

Vielleicht wäre es besser, nicht alles in einen Thread zu schreiben. Wer das später mal liest blickt hier gar nicht mehr durch.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo und guten Abend zusammen,

Ich muss etwas anderes Mal wieder machen,
so komme ich auf eine recht alte Fragestellung zurück.

Und ich hoffe, Ihr seid mir nicht böse, da die Frage etwas älter ist und ich nicht mehr
alles so präsent habe.

Grundsätzlich spiele ich am Originalen noch etwas herum.
Gelöst wurde der Bereich, Datei erstellen.

Wo es für mich noch etwas hapert um beim Original auf PB 6.12 angepasst zu bleiben.

Mein Dreh- und Angelpunkt war:

Code: Alles auswählen

      UnPackErg = UncompressMemory(?ReadMePak, MHndl1,?ReadMePakEnd, unkompress_puffer,#PB_PackerPlugin_BriefLZ) ;gibt die Länge zurück 
*Puffer | die gepackte Datei als Speichergröße
*Größe | die Speichergröße welche reserviert wurde für das gepackte File
*Ausgabe | Speichergröße der entpackten Datei
*Ausgabegröße | Minimum so groß wie *Ausgabe

Und bitte, ich versuche wieder zu verstehen, was zu dieser Problematik gehört, da ich wieder mal etwas ganz anderes machen muss.
Das als versuch zu rekapitulieren, was ich denke zu verstehen Stand Dezember 2024

Dort wo ich ja Probleme sah, war, zu erkennen, wie groß das eigentliche File ist.
Prozedure "puffer":

Code: Alles auswählen

Procedure puffer()
  ; Öffnet die gepackte Datei
  If OpenPack(0, "ReadmePacker_Liesmich.pak" ) 
    
unkompress_puffer = PackEntrySize(0, #PB_Packer_UncompressedSize)
    ClosePack(0)
  EndIf
  EndProcedure
Würde ergeben ich habe die maximale Speichergröße (Ausgabegröße) ist meine Überlegung hier die richtige?
Oder muss ich diesen doch höher ansetzen, damit die Datei (Ausgabe) nicht größer ist als Ausgabegröße ?

UnPackErg muss eine grösse ausgeben von grösser als 0
Die längste Zeit hatte ich Werte -1
Momentan habe ich etwas besser Wert 0 was aber immer noch Falsch ist.

Ich bin mir noch nicht im Klaren, wo, dass ich einen Denkfehler haben könnte.
Ist jedoch sicher vor meiner Nase und will es mir einfach nicht sagen.


ReadMe.pb (Anzeige eines Textes)

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3038&highlight=
; Author: AndyMars  (some slightly modifications by Andre for the CodeArchiv, updated for PB3.93 by ts-soft, updated for PB 4.00 by Andre)
; Date: 06. December 2003
; OS: Windows
; Demo: No


; Part 2/2 of the ReadmePacker - includes the packed readme file,
; formerly created with the ReadmePacker_CreatePak source


;Andy Marschner - Switzerland 
;RPacks entpacken 
;erstellt mit/für PureBasic 3.8 

#Window_FormInfo=1 
#Gadget_FormInfo_ButtonOK=1 
#Gadget_FormInfo_EditorInfo=2 
UseBriefLZPacker()
  
Procedure.l Window_FormInfo() 
  If OpenWindow(#Window_FormInfo,100,100,367,218,"Info",#PB_Window_ScreenCentered) 
;    If CreateGadgetList(WindowID(#Window_FormInfo)) 
      ButtonGadget(#Gadget_FormInfo_ButtonOK,145,195,60,20,"OK") 
      EditorGadget(#Gadget_FormInfo_EditorInfo,0,0,365,190) 
      HideWindow(#Window_FormInfo,0) 
      ProcedureReturn WindowID(#Window_FormInfo) 
    EndIf 
;  EndIf 
EndProcedure 

Procedure puffer()
  ; Öffnet die gepackte Datei
  If OpenPack(0, "ReadmePacker_Liesmich.pak" ) 
    
unkompress_puffer = PackEntrySize(0, #PB_Packer_UncompressedSize)
    ClosePack(0)
  EndIf
  EndProcedure
;-ASM Prozeduren ---------------------------------------------------------------------------- 
Procedure _M(Text.s) 
  MessageRequester(" Meldung", Text, #PB_MessageRequester_Ok);$ 
EndProcedure 

Procedure _Info() 
  If Window_FormInfo() 
    laenge = ?ReadMePakEnd - ?ReadMePak 
     MHndl1 = AllocateMemory(laenge*3) 
    Debug "3facher Wert von laenge" + " "+ Str(MHndl1)
    
    If MHndl1
;    Debug "Entpackte Grösse"+" " +PackEntrySize(ReadMePakEnd,#PB_Packer_UncompressedSize)
      UnPackErg = UncompressMemory(?ReadMePak, MHndl1,?ReadMePakEnd*12, unkompress_puffer*24,#PB_PackerPlugin_BriefLZ) ;gibt die Länge zurück 
;      Debug "Rückgabewert muss höher als 0 sein"  + " " + Str(UnPackErg)
      If UnPackErg
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETREADONLY , 1, 0) 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETTARGETDEVICE, #Null, 0);Wordwrap 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo), #EM_LIMITTEXT, -1, 0) 
        SetGadgetText(#Gadget_FormInfo_EditorInfo,PeekS(MHndl1,UnPackErg)) 
      Else 
        _M("Fehler in _Info() beim Entpacken der Infodaten!") 
      EndIf 
      FreeMemory(MHndl1) 
    Else 
      _M("Fehler in _Info(): Konnte Speicher nicht anfordern!") 
    EndIf 
    While InfoEnde=0 
      EventID = WaitWindowEvent() 
      If EventWindow()=#Window_FormInfo 
        If EventID = #PB_Event_CloseWindow 
          InfoEnde=1 
        ElseIf EventID = #PB_Event_Gadget 
          Gadget = EventGadget() 
          If Gadget = #Gadget_FormInfo_ButtonOK 
            InfoEnde=1 
          EndIf 
        EndIf 
      Else 
        SetForegroundWindow_(WindowID(#Window_FormInfo)) 
      EndIf 
    Wend 
    CloseWindow(#Window_FormInfo) 
  Else 
    _M("Fehler in _Info(): Konnte Fenster Window_FormInfo() nicht öffnen!") 
  EndIf 
  
      

EndProcedure 

;-MAIN -------------------------------------------------------------------------------------- 
_Info() 

End 

ReadMePak:
IncludeBinary "ReadmePacker_Liesmich.pak" 
ReadMePakEnd:


; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP
; Executable = C:\Programming\Examples.exe
Erstellt ein PAK File: ReandMe-Packer.pb

Code: Alles auswählen

Declare _M(Text$)

; Author: AndyMars  (some modifications by ChrigiGee)
; Date: 28. Juli 2024
; OS: Windows
; Demo: unknow

; Part 1/2 of the ReadmePacker - creates a packed readme file,
; later to be included in the ReadmePacker_CreateExe example

;
; ------------------------------------------------------------
;
;   PureBasic - Compressor example file
;
;    (c) Fantaisie Software 
;
; ------------------------------------------------------------
;erstellt mit für PureBasic 6




Procedure _M(Text$)
  MessageRequester("Meldung",Text$)
EndProcedure

OpenPreferences("ReadmePacker.ini")
SourceFile.s=ReadPreferenceString("SourceFile","")
TargetFile.s=ReadPreferenceString("TargetFile","")
ClosePreferences()


UseBriefLZPacker() ; Small and fast packer

If CreatePack(0, TargetFile, #PB_PackerPlugin_BriefLZ, 9)
 
EndIf


If ReadFile(0, SourceFile)
  FileLength = Lof(0)
  
  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength)
 
  If FileLength And *Source And *Target
    ReadData(0, *Source, FileLength) ; Read the whole file in the memory buffer
  CloseFile(0)  
    ; Compress the file, which is in memory
    ;
    CompressedLength = AddPackMemory(0, *Source, FileLength, TargetFile)
    If CompressedLength

      DecompressedLength = UncompressPackMemory(0, *Target, CompressedLength, TargetFile)
      If DecompressedLength = FileLength
      
Debug *Source
Debug *Target 
        
AddPackMemory(0, *Source, FileLength, TargetFile)
        
;        MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
 
Debug "Koprimiert:" + Str(CompressedLength)
Debug "De Komprimiert:" + Str(DecompressedLength )

        ClosePack(0)
        

;    Else
      ;     MessageRequester("Error", "Can't compress the file")
 ;     _M("Error - cannot create file: "+TargetFile)
      
  ;  EndIf
  ;Else
   ;       _M("Error - compressing failed!")
    
    EndIf
;    FreeMemory(*Source)
 ;   FreeMemory(*Target)
    
;  EndIf
Else
    _M("Error - cannot open file: "+SourceFile)
;  CloseFile(0)
EndIf
EndIf
EndIf

End
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von Andesdaf »

Deine Prozedur puffer() ermittelt die Größe und schreibt sie in die Variable unkompress_puffer. Diese wird aber nicht zurückgegeben und ist auch nicht als Global definiert, sodass beim erneuten Aufruf von unkompress_puffer innerhalb von _Info() eine neue gleichnamige Variable mit dem Initialwert 0 genutzt wird. Nutze EnableExplicit, dann fällt so etwas auf.
Win11 x64 | PB 6.20
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo und einen wunderschönen guten Morgen @all
Hallo Andersdaf, auch Dir einen wunderschönen Tag,

Vielen herzlichen Dank für Deinen Input, die letzten Tage musste mein Hirnakrobatik wechsel etwas ruhen,
Und ich habe noch einige Fehler feststellen müssen, welche mir zuvor entgangen sind.

Beginn bereits beim Erstellen der "pak" Datei.
Unter der PB eigenen Packer Routine wurde die Datei zuvor erstellt, Größe 1.48 KB, wahrscheinlich aber völlig inkorrekt.
Denn unter LZMA wurde besagte Datei mit 0 Byte erstellt oder überhaupt nicht.

Somit bin ich etwas am Suchen, wo sich der Fehler eingeschlichen haben könnte.
Unterdessen habe ich mich mit dem Erstellen der pak Datei gewidmet.

Ich bin mir nicht sicher, ich habe zwei Fehlermeldungen, welche erscheinen.
Zum einen, dass die Datei "liesmich.txt" nicht geöffnet werden kann. resp. einen
Speicherfehler, der sich im Bereich des Speicherbereiches "target" befindet.

Ich bin nicht sicher, ob es sich dabei um ein Problem intern handelt,
dass die Textdatei nicht Standard konform ist, sprich, UTF-8 oder ASCII oder ANSI oder ob ich sonst etwas übersehe.

Sofern das Öffnen kein Problem machen sollte, gibts dafür wie erwähnt den Speicher Error.

Also habe ich bereits beim Erstellen besagter pak Datei einige Fehler eingebaut
oder noch nicht gelöst, sodass es mit dem Anzeigen der Daten auch noch zu Problemen kommen würde.

Nachdem erstellen der pak Datei an sich, welche Wahlweise mit LZMA oder BriefLZ erstellt wurde
ergeben sich unterschiedliche Szenarien zuerst.

Speicherfehler Adresse XYZ
Datei kann nicht gelesen werden


Ich bin mir bewusst, dass das Aufbauen auf solch skrupellos altem Source viele Hürden beinhaltet
da entweder Befehle gar nicht mehr existieren oder massiv geändert haben.

Heute klappt es mal wieder ganz toll, ich muss meine Texte 100-mal ändern, sodass ich keine Romane schreibe
und immer noch alles in der Hoffnung des Verständlichen bleibt.

Herzliche Grüsse
Christian


===

Die Erkenntnisse und Versuche als Link (readme.txt bedingt):
https://e.pcloud.link/publink/show?code ... QkWHV655VX

===

readme_pak.pb

Code: Alles auswählen

Declare _M(Text$)

; Author: AndyMars  (some modifications by ChrigiGee)
; Date: 28. Juli 2024
; OS: Windows
; Demo: unknow

; Part 1/2 of the ReadmePacker - creates a packed readme file,
; later to be included in the ReadmePacker_CreateExe example

;
; ------------------------------------------------------------
;
;   PureBasic - Compressor example file
;
;    (c) Fantaisie Software 
;
; ------------------------------------------------------------
;erstellt mit für PureBasic 6




Procedure _M(Text$)
  MessageRequester("Meldung",Text$)
EndProcedure

OpenPreferences("ReadmePacker.ini")
SourceFile.s=ReadPreferenceString("SourceFile","")
TargetFile.s=ReadPreferenceString("TargetFile","")
ClosePreferences()

;UseLZMAPacker()
UseBriefLZPacker() ; Small and fast packer

If CreatePack(0, TargetFile, #PB_PackerPlugin_BriefLZ )
;If CreatePack(0, TargetFile,  #PB_PackerPlugin_Lzma )
  
   
;EndIf


If ReadFile(0, SourceFile)
  FileLength = Lof(0)
  
  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength + 8)
 
  If FileLength And *Source And *Target
    ReadData(0, *Source, FileLength) ; Read the whole file in the memory buffer
  CloseFile(0)  
    ; Compress the file, which is in memory
    ;
;If CreatePack(0, TargetFile, #PB_PackerPlugin_BriefLZ )
;If CreatePack(0, TargetFile,  #PB_PackerPlugin_Lzma )

    CompressedLength = AddPackMemory(0, *Source, *Target, TargetFile)
    If CompressedLength

      DecompressedLength = UncompressPackMemory(0, *Target, CompressedLength, TargetFile)
      If DecompressedLength = FileLength
      
Debug *Source
Debug *Target 
        
AddPackMemory(0, *Source, FileLength, TargetFile)
        
;        MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
 
Debug "Koprimiert:" + Str(CompressedLength)
Debug "De Komprimiert:" + Str(DecompressedLength )

        ClosePack(0)
        

;    Else
      ;     MessageRequester("Error", "Can't compress the file")
 ;     _M("Error - cannot create file: "+TargetFile)
      
  ;  EndIf
  ;Else
   ;       _M("Error - compressing failed!")
    
    EndIf
;    FreeMemory(*Source)
 ;   FreeMemory(*Target)
    
;  EndIf
Else
    _M("Error - cannot open file: "+SourceFile)
;  CloseFile(0)
EndIf
EndIf
EndIf
EndIf
End
===

Erkentnisse ReadMe.pb:

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3038&highlight=
; Author: AndyMars  (some slightly modifications by Andre for the CodeArchiv, updated for PB3.93 by ts-soft, updated for PB 4.00 by Andre)
; Date: 06. December 2003
; OS: Windows
; Demo: No


; Part 2/2 of the ReadmePacker - includes the packed readme file,
; formerly created with the ReadmePacker_CreatePak source


;Andy Marschner - Switzerland 
;RPacks entpacken 
;erstellt mit/für PureBasic 3.8 

Declare puffer()
Declare _M(Text.s)
Declare _Info()

#Window_FormInfo=1 
#Gadget_FormInfo_ButtonOK=1 
#Gadget_FormInfo_EditorInfo=2 

Global unkompress_puffer
Global kompress_puffer
Global ReadPack
Global ReadPackEnd
Global ReadMePak
Global ReadMePakEnd
Global ReadMeFile$
;AllocateMemory(ReadMePak)
;AllocateMemory(ReadMePakEnd)
ReadMeFile$ = "ReadmePacker_Liesmich.pak"

;- Packer Metode
;UseBriefLZPacker()
UseLZMAPacker()
  
Procedure.l Window_FormInfo() 
  If OpenWindow(#Window_FormInfo,100,100,367,218,"Info",#PB_Window_ScreenCentered) 
;    If CreateGadgetList(WindowID(#Window_FormInfo)) 
      ButtonGadget(#Gadget_FormInfo_ButtonOK,145,195,60,20,"OK") 
      EditorGadget(#Gadget_FormInfo_EditorInfo,0,0,365,190) 
      HideWindow(#Window_FormInfo,0) 
      ProcedureReturn WindowID(#Window_FormInfo) 
    EndIf 
;  EndIf 
EndProcedure 

Procedure puffer()
  ;- Öffnet die gepackte Datei
  
;  If OpenPack(0, ReadMeFile$,#PB_PackerPlugin_BriefLZ) 
  If OpenPack(0, ReadMeFile$,#PB_PackerPlugin_Lzma) 
    
unkompress_puffer = PackEntrySize(0, #PB_Packer_UncompressedSize)
kompress_puffer = PackEntrySize(0, #PB_Packer_CompressedSize)
    ClosePack(0)
    
  EndIf
  EndProcedure
;-ASM Prozeduren ---------------------------------------------------------------------------- 
Procedure _M(Text.s) 
  MessageRequester(" Meldung", Text, #PB_MessageRequester_Ok);$ 
EndProcedure 

Procedure _Info() 
  If Window_FormInfo() 
    laenge = ?ReadMePakEnd - ?ReadMePak
    ReadMePak = ?ReadMePak 
    ReadMePakEnd = ?ReadMePakEnd 
     MHndl1 = AllocateMemory(laenge*3) 
    Debug "3facher Wert von laenge" + " "+ Str(MHndl1)
    Debug unkompress_puffer
    If MHndl1
;    Debug "Entpackte Grösse"+" " +PackEntrySize(ReadMePakEnd,#PB_Packer_UncompressedSize)
;      UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd*12, unkompress_puffer*24,#PB_PackerPlugin_BriefLZ) ;gibt die Länge zurück 
      UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd*12, unkompress_puffer*24,#PB_PackerPlugin_Lzma) ;gibt die Länge zurück 
;      Debug "Rückgabewert muss höher als 0 sein"  + " " + Str(UnPackErg)
      If UnPackErg
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETREADONLY , 1, 0) 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETTARGETDEVICE, #Null, 0);Wordwrap 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo), #EM_LIMITTEXT, -1, 0) 
        SetGadgetText(#Gadget_FormInfo_EditorInfo,PeekS(MHndl1,UnPackErg)) 
      Else 
        _M("Fehler in _Info() beim Entpacken der Infodaten!") 
      EndIf 
      FreeMemory(MHndl1) 
    Else 
      _M("Fehler in _Info(): Konnte Speicher nicht anfordern!") 
    EndIf 
    While InfoEnde=0 
      EventID = WaitWindowEvent() 
      If EventWindow()=#Window_FormInfo 
        If EventID = #PB_Event_CloseWindow 
          InfoEnde=1 
        ElseIf EventID = #PB_Event_Gadget 
          Gadget = EventGadget() 
          If Gadget = #Gadget_FormInfo_ButtonOK 
            InfoEnde=1 
          EndIf 
        EndIf 
      Else 
        SetForegroundWindow_(WindowID(#Window_FormInfo)) 
      EndIf 
    Wend 
    CloseWindow(#Window_FormInfo) 
  Else 
    _M("Fehler in _Info(): Konnte Fenster Window_FormInfo() nicht öffnen!") 
  EndIf 
  
      
; ClosePack(0)
EndProcedure 

;-MAIN -------------------------------------------------------------------------------------- 
_Info() 

End 

ReadMePak:
IncludeBinary "ReadmePacker_Liesmich.pak" 
ReadMePakEnd:


; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP
; Executable = C:\Programming\Examples.exe
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von H.Brill »

Denn unter LZMA wurde besagte Datei mit 0 Byte erstellt oder überhaupt nicht.
Bei mir geht LZMA auch nicht, nur ZIP. Ich haber aber auch kein entsprechendes PlugIn installiert.
Da kommt aber auch eine entsprechende Fehlermeldung, daß das Plugin nicht installiert ist.
Ich würde den ZIP-Packer bevorzugen. Der ist ja seit ein paar Windowsversionen standardmäßig
dabei. Bei LZMA muß dein Anwender ja auch den entsprechenden Packer installiert haben.
Damit nötigst du ihn, diesen auch zu installieren.

Hast du nur eine einzelne Datei zu packen oder sind das mehrere ?
Eine einzelne Datei geht auch so :

Code: Alles auswählen

textdatei.s = "F:\text.txt"  ; Pfade anpassen
packdatei.s = "F:\text.pak"

If OpenFile(0, textdatei)
	length = Lof(0)
	*Buffer1 = AllocateMemory(length)
  *Buffer2 = AllocateMemory(length)
  ReadData(0, *Buffer1, length)
  CloseFile(0)
EndIf  
UseZipPacker()

Debug PeekS(*Buffer1, length, #PB_Ascii)


CompressMemory(*Buffer1, MemorySize(*Buffer1), *Buffer2, MemorySize(*Buffer2), #PB_PackerPlugin_Zip )

If CreateFile(1, packdatei)
	WriteData(1, *Buffer2, MemorySize(*Buffer2))
	CloseFile(1)
EndIf	
FillMemory(*Buffer2, length) ; *Buffer2 leeren zum späteren Befüllen mit UnCompressMemory()
FillMemory(*Buffer1, length)

If OpenFile(2, packdatei)
	length = Lof(2)
	ReadData(2, *Buffer1, length)
  UncompressMemory(*Buffer1, MemorySize(*Buffer1), *Buffer2, MemorySize(*Buffer2), #PB_PackerPlugin_Zip )
  Debug "der entkomprimierte Text : " + Chr(13) + PeekS(*Buffer2, MemorySize(*Buffer2), #PB_Ascii)
EndIf

FreeMemory(*Buffer1)
FreeMemory(*Buffer2)
In der Debug-Ausgabe siehst du, daß der Text zweimal da ist.
PB 6.10
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo H. Brill,

Es ist eigentlich in diesem Beispiel eine einzelne Datei.
Aus Bequemlichkeit, dass ich das ganze über die ini ändern kann
habe ich es nicht fix hinterlegt.

Momentan bin ich mir sicher, dass die Source überall durchgeht.
Das pak File wird jedoch bereits beim Berechnen der CompressedLength
mit Rückgabewert 0 beendet.

Code: Alles auswählen

    CompressedLength = AddPackMemory(1, *Source, *Target, TargetFile)
    If CompressedLength

      DecompressedLength = UncompressPackMemory(1, *Target, CompressedLength, TargetFile)
      If DecompressedLength = FileLength
      
Sehr speziell, sowohl LZMA und ZIP als Kompression Algo verweigern, mit Fehler, Speicherverletzung.
Über BriefLZ wird der Fehler ausgewertet, mit der Meldung konnte pak nicht erstellen.

Ich blicke nicht ganz durch, was denn die Speicherverletzung verursacht, resp.
CompressedLength bereits mit Wert 0 kommt.

Dass anschließend DecompressedLength einen Wert 0 besitzt, ist logisch.
Werte wie *target und *source werden korrekt ausgewiesen.

Ich habe das txt File nun von 2kb auf rund 5kb aufgebläht zum Testen.
Dort stehen keine Unterschiede ob 2kb oder 4kb resp. 5kb.

Ein weiterer Gedanke von mir war, ob CreatePack(0) einen Konflikt bekommt mit OpenFile(0) resp. ReadData((0)
und CloseFile(0)

Was sich aber nicht zeigte, oder ich habe es nicht deuten können.
Das Löschen von der pak Datei, damit auch hier ein Fehler ausgeschlossen werden kann, ergab auch keine Änderung.

Die Vermutung, dass sich

Code: Alles auswählen

  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength+8)
Dahinter ein Fehler verbirgt, konnte ich so nicht erkennen.
Wenn die Werte " FileLength + 8" verändert werden ändert sich nicht daran dass eine Fehlermeldung erscheint.
Es ändert höchtens der Wert der Speichers in dem Fall.

Herzliche Grüsse
Christian
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo und einen wunderschönen Abend Euch allen,

Genießt den Abend, ich in Thailand bleibe damit fern.
Aber unterdessen bin ich mit dem Packen fertig, pak File steht und funktioniert dieses Mal wirklich.
Nach Langem Händeringen....

Das Auslesen klappt bei mir leider "noch" nicht.
Vermutlich wäre alles korrekt, aber ich muss mal schauen, Fehler gibt es keine.
Nur das Editorfenster hat keinen Inhalt.

Dafür möchte ich Euch das Resultat der letzten Tage nicht vorenthalten.

bin froh, wieder etwas Hirnakrobatik dazwischen nebst dem Anderen was ich versuche zu erstellen.

Liebe Grüße und schöne Weihnachten aus Thailand
Christian


PS: Wirklich ein riesengroßes Dankeschön an Euch alle, die mir helft.
Auch wenn ich etwas Speziell bin bei den Fragen.


ReadMePak.pb

Code: Alles auswählen

Declare _M(Text$)

; Author: AndyMars  (some modifications by ChrigiGee)
; Date: 28. Juli 2024
; OS: Windows
; Demo: unknow

; Part 1/2 of the ReadmePacker - creates a packed readme file,
; later to be included in the ReadmePacker_CreateExe example

;
; ------------------------------------------------------------
;
;   PureBasic - Compressor example file
;
;    (c) Fantaisie Software 
;
; ------------------------------------------------------------
;erstellt mit für PureBasic 6


UseBriefLZPacker() ; Small and fast packer
UseZipPacker()
UseLZMAPacker()



Procedure _M(Text$)
  MessageRequester("Meldung",Text$)
EndProcedure

OpenPreferences("ReadmePacker.ini")
SourceFile.s=ReadPreferenceString("SourceFile","")
TargetFile.s=ReadPreferenceString("TargetFile","")
ClosePreferences()



;If CreatePack(0, TargetFile, #PB_PackerPlugin_BriefLZ )
;If CreatePack(0, TargetFile,  #PB_PackerPlugin_Zip )
;If CreatePack(0, TargetFile,  #PB_PackerPlugin_Lzma )
  
   
;EndIf

OpenFile(0, SourceFile )
If ReadFile(0, SourceFile)
  FileLength = Lof(0)
  
  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength+8)
 
  If FileLength And *Source And *Target
    ReadData(0, *Source, FileLength) ; Read the whole file in the memory buffer
  CloseFile(0)  
    ; Compress the file, which is in memory


;If CreatePack(0, TargetFile, #PB_PackerPlugin_BriefLZ )
If CreatePack(0, TargetFile,  #PB_PackerPlugin_Zip )
;If CreatePack(0, TargetFile,  #PB_PackerPlugin_Lzma )

;    CompressedLength = AddPackMemory(0, *Source, *Target, SourceFile)
;    If CompressedLength

;      DecompressedLength = UncompressPackMemory(0, *Target, CompressedLength, TargetFile)
;      If DecompressedLength = FileLength
      
Debug *Source
Debug *Target 
        
AddPackMemory(0, *Source, FileLength, SourceFile)
        
;        MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
 
;Debug "Koprimiert:" + Str(CompressedLength)
;Debug "De Komprimiert:" + Str(DecompressedLength )

        ClosePack(0)
        

    Else
        MessageRequester("Error", "Can't compress the file")
      _M("Error - cannot create file: "+TargetFile)
      
   EndIf
  Else
          _M("Error - compressing failed!")
    
;    EndIf
    FreeMemory(*Source)
    FreeMemory(*Target)
    
  EndIf
Else
    _M("Error - cannot open file: "+SourceFile)
  CloseFile(0)
EndIf
;EndIf
;EndIf
;EndIf
;EndIf
End
Ist schon klar, es ist noch nicht Form schön, aber funktionstüchtig.

Anzeige pak File, ReadMe.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3038&highlight=
; Author: AndyMars  (some slightly modifications by Andre for the CodeArchiv, updated for PB3.93 by ts-soft, updated for PB 4.00 by Andre)
; Date: 06. December 2003
; OS: Windows
; Demo: No


; Part 2/2 of the ReadmePacker - includes the packed readme file,
; formerly created with the ReadmePacker_CreatePak source


;Andy Marschner - Switzerland 
;RPacks entpacken 
;erstellt mit/für PureBasic 3.8 

Declare puffer()
Declare _M(Text.s)
Declare _Info()

#Window_FormInfo=1 
#Gadget_FormInfo_ButtonOK=1 
#Gadget_FormInfo_EditorInfo=2 

Global unkompress_puffer
Global kompress_puffer
Global ReadPack
Global ReadPackEnd
Global ReadMePak
Global ReadMePakEnd
Global ReadMeFile$
;AllocateMemory(ReadMePak)
;AllocateMemory(ReadMePakEnd)
ReadMeFile$ = "ReadmePacker_Liesmich.pak"

UseBriefLZPacker() ; Small and fast packer
UseZipPacker()
UseLZMAPacker()
  
Procedure.l Window_FormInfo() 
  If OpenWindow(#Window_FormInfo,100,100,367,218,"Info",#PB_Window_ScreenCentered) 
;    If CreateGadgetList(WindowID(#Window_FormInfo)) 
      ButtonGadget(#Gadget_FormInfo_ButtonOK,145,195,60,20,"OK") 
      EditorGadget(#Gadget_FormInfo_EditorInfo,0,0,365,190) 
      HideWindow(#Window_FormInfo,0) 
      ProcedureReturn WindowID(#Window_FormInfo) 
    EndIf 
;  EndIf 
EndProcedure 

Procedure puffer()



  ;- Öffnet die gepackte Datei
  
;  If OpenPack(0, ReadMeFile$) 
;  If OpenPack(0, ReadMeFile$,#PB_PackerPlugin_BriefLZ) 
  If OpenPack(0, ReadMeFile$,#PB_PackerPlugin_Zip) 
;  If OpenPack(0, ReadMeFile$,#PB_PackerPlugin_Lzma) 

If ExaminePack(0)    
      While NextPackEntry(0)
      
unkompress_puffer = PackEntrySize(0, #PB_Packer_UncompressedSize)
kompress_puffer = PackEntrySize(0, #PB_Packer_CompressedSize)



        Debug "Name: " + PackEntryName(0) + ", Size: " + PackEntrySize(0)
      Wend
    EndIf
    

    ClosePack(0)
    
  EndIf
;  EndIf
  EndProcedure
;-ASM Prozeduren ---------------------------------------------------------------------------- 
Procedure _M(Text.s) 
  MessageRequester(" Meldung", Text, #PB_MessageRequester_Ok);$ 
EndProcedure 

Procedure _Info() 
  If Window_FormInfo() 
    laenge = ?ReadMePakEnd - ?ReadMePak
    ReadMePak = ?ReadMePak 
    ReadMePakEnd = ?ReadMePakEnd 
     MHndl1 = AllocateMemory(laenge*3) 
;    Debug "3facher Wert von laenge" + " "+ Str(MHndl1)
;    Debug unkompress_puffer
    If MHndl1
;    Debug "Entpackte Grösse"+" " +PackEntrySize(ReadMePakEnd,#PB_Packer_UncompressedSize)
;      UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd+8, unkompress_puffer+8,#PB_PackerPlugin_BriefLZ) ;gibt die Länge zurück 
UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd, unkompress_puffer) ;gibt die Länge zurück 
;      UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd, unkompress_puffer,#PB_PackerPlugin_Zip) ;gibt die Länge zurück 
;      UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd, unkompress_puffer,#PB_PackerPlugin_Lzma) ;gibt die Länge zurück 
;      Debug "Rückgabewert muss höher als 0 sein"  + " " + Str(UnPackErg)
      If UnPackErg
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETREADONLY , 1, 0) 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETTARGETDEVICE, #Null, 0);Wordwrap 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo), #EM_LIMITTEXT, -1, 0) 
        SetGadgetText(#Gadget_FormInfo_EditorInfo,PeekS(MHndl1,UnPackErg)) 
      Else 
        _M("Fehler in _Info() beim Entpacken der Infodaten!") 
      EndIf 
      FreeMemory(MHndl1) 
    Else 
      _M("Fehler in _Info(): Konnte Speicher nicht anfordern!") 
    EndIf 
    While InfoEnde=0 
      EventID = WaitWindowEvent() 
      If EventWindow()=#Window_FormInfo 
        If EventID = #PB_Event_CloseWindow 
          InfoEnde=1 
        ElseIf EventID = #PB_Event_Gadget 
          Gadget = EventGadget() 
          If Gadget = #Gadget_FormInfo_ButtonOK 
            InfoEnde=1 
          EndIf 
        EndIf 
      Else 
        SetForegroundWindow_(WindowID(#Window_FormInfo)) 
      EndIf 
    Wend 
    CloseWindow(#Window_FormInfo) 
  Else 
    _M("Fehler in _Info(): Konnte Fenster Window_FormInfo() nicht öffnen!") 
  EndIf 
  
      
; ClosePack(0)
EndProcedure 

;-MAIN -------------------------------------------------------------------------------------- 
puffer()
_Info() 

End 

ReadMePak:
IncludeBinary "ReadmePacker_Liesmich.pak" 
ReadMePakEnd:


; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP
; Executable = C:\Programming\Examples.exe
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von H.Brill »

Ich hatte auch mal so einen ähnlichen Fehler.
Damals hatte ich den Speicher um 3 Bytes größer gemacht, als nötig.
Und den Speicher zum Entpacken auch. Warum das so war, weiß ich auch
nicht. Hier kannst du das mal nachvollziehen :

Code: Alles auswählen

text.s = "Hallo Welt !"
length = Len(text) ; + 3
*buff1 = AllocateMemory(length)
*buff2 = AllocateMemory(length)
*buff3 = AllocateMemory(length)
PokeS(*buff1, text, length, #PB_Ascii)
UseZipPacker()
CompressMemory(*buff1, length, *buff2, length, #PB_PackerPlugin_Zip)
UncompressMemory(*buff2, length, *buff3, length, #PB_PackerPlugin_Zip)
Debug PeekS(*buff3, length, #PB_Ascii)
Da siehst du, daß die letzten beiden Zeichen fehlen. Erhöhe mal schrittweise

Code: Alles auswählen

length = Len(text) + 1 
usw.
Erst bei + 3 kommt auch alles wieder zum Vorschein.
Ist mal nur zur Info.
PB 6.10
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von Axolotl »

Da in PB die Strings UNICODE kodiert sind, könnte es sein, dass hier die Länge je nach Funktion in Bytes oder Characters verwendet werden sollte.
S.a. Unterschied zwischen Len() und StringByteLength()

Ich kann mich (leider) immer nur wiederholen: Die Hilfe (über F1) ist Dein bester Freund. Sie erklärt Dir jede Funktion und seine Parameter!

Frohe Weihnachten.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von H.Brill »

Axolotl hat geschrieben: 24.12.2024 17:06 Ich kann mich (leider) immer nur wiederholen: Die Hilfe (über F1) ist Dein bester Freund. Sie erklärt Dir jede Funktion und seine Parameter!
Auf
StringByteLength()
sollte dann auch bei Len() hingewiesen werden.
Ein neuer Basicianer kommt da bestimmt nicht drauf.
Auch dort wird das abschließende Nullbyte nicht berücksichtigt. Also muß man doch wieder
selber Hand anlegen.
PB 6.10
Antworten