[PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

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: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hi Kiffi,

nun ich bin mir bewusst, dass ich viele Fehler begehe, ich, mit den vielen Ansätzen welche ich bekomme jedoch zumal
etwas überfordert bin, da ich das Wissen noch nicht besitze.

Ich versuche die verschiedenen Ansätze, denen ich am besten folgen kann umzusetzen.
Auch wenn ich dann und wann wieder einen Überlegungsfehler begehe.

Ich möchte etwas lernen, auch wenn ich vielleicht zum alt Eisen eher gehöre, mit meinem alter.
Vielleicht auch etwas mehr Zeit beanspruche für den einen oder anderen hier im Forum.

Jeder lernt auf seine Weise, jeder hat auf seine Weise Vorkenntnisse oder aber nicht.
Meine Vorkenntnisse stammen aus der DOS-Zeit ansonsten mehr oder weniger auch Anwender.

Also muss ich recht viel aufarbeiten. Zusätzlich DOS Basic und DOS Pascal sich Strukturell wohl
gewaltig geändert haben und ich auch aus dieser Zeit extrem viel wieder vergessen habe.

Manchmal vermischen sich bei mir Sachen aus Pascal und Basic, das mag auch sehr gut sein.

Ich versuche auch die thailändische Sprache zu lernen....

Herzliche Grüsse aus dem nassen Bern
Christian
Kiffi hat geschrieben: 07.09.2024 20:06 <OT>

ist schon beeindruckend, wie man so einen kurzen Code mit sechs Gadgets und einer Prozedure auf acht Dateien aufblähen und totdiskutieren kann. :shock:

</OT>
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: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo H. Brill,

Habe ich wohl missverstanden, das mit dem Add von Werten nachträglich.
Ich müsste also spätestens nachdem ich den 3. Werte, Dateinamen mit Verzeichnis Angabe
besitze diese in der INI / Pref Datei speichern.

Wieder eine Fehlüberlegung von meiner Seite.

Spannend, dass alle drei Variablen "File1" bis "File3" nicht mehr existent sind, nachdem sie die Procedure verlassen haben.

Code: Alles auswählen

Procedure ButtonHandler()
  ;Debug "Button click event on gadget #" + EventGadget()
  ; wenn man hier den EventGadget mit EventGadget() ermittelt und mit If... abfragt,
  ; hat man eine Universal-Procedure für alle anfallenden Button-Gadgets
  If EventGadget() = 3 
    
    InitialPath1$ = "C:\my Basic\PureBasic\source.txt"   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
    Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
    Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
    File1$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath1$, Pattern$, Pattern)
    SetGadgetText(#Str_Source_DIR, File1$)
      IncludeFile  "CreatePreferencesA.pbi"
  ;  IncludeFile "OpenPreferences.pbi"
    
  ElseIf EventGadget() = 4
    
    InitialPath2$ = "C:\my Basic\PureBasic\target.txt"   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
    Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
    Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
    File2$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath2$, Pattern$, Pattern)
    SetGadgetText(#Str_Target_DIR, File2$)
      IncludeFile  "CreatePreferencesB.pbi"
    IncludeFile "OpenPreferences.pbi"
    
        Debug File1$ <- existiert nicht mehr
    
  ElseIf EventGadget() = 5          
    
    InitialPath3$ = "C:\my Basic\PureBasic\my Patch\new\patch.csp"   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
    Pattern$ = "executable (*.exe;*.dll)|*.exe;*.dll|Alle Dateien (*.*)|*.*"
    Pattern = 1    ; wir verwenden den ersten von drei möglichen Pattern als Standard
    File3$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath3$, Pattern$, Pattern)
    SetGadgetText(#Str_Patch_DIR, File3$)
    IncludeFile  "CreatePreferencesC.pbi"
    IncludeFile "OpenPreferences.pbi"
    
    Debug File1$ <- existiert nicht mehr
    Debug File2$ <- existiert nicht mehr
    Debug File3$
    createpatch(File1$,File2$,File3$)
    
    
  EndIf
  IncludeFile "OpenPreferences.pbi"
 ; createpatch(File1$,File2$,File3$)
EndProcedure
Danke Euch allen für die vielen Hilfen von Euch allen.
Ich werde versuchen herauszufinden, wie ich diese Variablen "File1" bis "File3"
nach wie vor existierend zur Verfügung habe.

Irgendwo denke ich, hab ich auch da wieder einen Fehler eingebaut.

Euch allen einen schönen Sonntag
Christian

H.Brill hat geschrieben: 07.09.2024 20:32 Vielleicht noch ein anderes Beispiel. Manchmal ist es in der Hilfe nicht so direkt ersichtlich.

Code: Alles auswählen

CreatePreferences("Spieler.pref", #PB_Preference_GroupSeparator)
meinevar$ = "Hallo"


  PreferenceGroup("Willi")
  WritePreferenceString("Datum", FormatDate("%dd.%mm.%YYYY", Date())) 
    WritePreferenceLong ("Bahn", 1)
    WritePreferenceLong ("Punkte", 100)     ; Punkte = 100
    WritePreferenceString("meineVar", meinevar$)
  
  PreferenceGroup("Maria")
  WritePreferenceString("Datum", FormatDate("%dd.%mm.%YYYY", Date())) 
    WritePreferenceLong ("Bahn", 5)
    WritePreferenceLong ("Punkte", 80)     ; Punkte = 80 
  ; Schließt die Preference-Datei
   ClosePreferences()
    
   If OpenPreferences("Spieler.pref")
       ExaminePreferenceGroups()
       While NextPreferenceGroup()
         texte$ = texte$ + PreferenceGroupName() + #LF$
         ExaminePreferenceKeys()
         While  NextPreferenceKey()                          
           texte$ = texte$ + PreferenceKeyName() + " = " + PreferenceKeyValue() + #LF$
         Wend
         texte$ = texte$ +  #LF$
       Wend
       Debug texte$
       ClosePreferences()
   EndIf
 
Hier siehst du, daß Keys (Datum, Bahn, Punkte) immer die gleichen sein können, nur mit verschiedenen Values.
Halt nur in verschiedenen Gruppen.
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: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von H.Brill »

Merke dir mal eines und das ist in jeder Sprache so :
Wenn du Variablen, in deinem Falle File1$, File2$, File3$ in einer Procedure
definierst bzw. wie du einfach ohne vorige Deklaration einsetzt,

Code: Alles auswählen

 File1$ = OpenFileRequester("Bitte Datei zum Laden auswählen", InitialPath1$, Pattern$, Pattern)
existieren diese NUR in deiner Procedure ButtonHandler(). Brauchst du aber die gleichen Variablen auch in anderen Proceduren
oder im Hauptprogramm, definiere sie doch einmalig am Anfang im Hauptprogramm mit Define oder Global. Somit sind sie an jeder
Stelle griffbereit.

Was dir fehlt, ist halt noch einiges an allgemeinem Grundwissen (Grundlagen Programmierung). Das kommt halt im Laufe der Zeit.
Ich hatte das Glück 1989 eine halbjährige Schulung zum PC-Programmierer (Arbeitsamt-Maßnahme) zu machen und konnte dann von
Grund auf dabei sein. Leider ist das dann nur ein Hobby geworden. Mensch, waren das Zeiten. Da ging mittags keiner nach Hause, der
Binärzahlen und Hexzahlen von bzw. zu Dezimalzahlen umrechnen + in 4 Grundrechenarten (+,-,:,*) konnte. Und das nicht am PC,
sondern auf einem Blatt Papier.
Seitdem hatte ich das noch nie gebraucht. Die Sprachen haben das ja alle als Funktionen schon drinnen.

Ich muß aber sagen, daß ich heutzutage mit 66 Jahren immer noch Spaß daran habe. Halt nach dem Motto von Udo Jürgens :
Mit 66 Jahren.......

Und mach es doch mal ganz einfach :

Code: Alles auswählen

Define texte$

CreatePreferences("Pfade.pref")
Datei1$ = "C:\Source\meine.exe"
Datei2$ = "C:\Target\meine.exe"
Datei3$ = "C:\patch\mein-patch.ptc"

WritePreferenceString("Datei1", Datei1$) 
WritePreferenceString("Datei2", Datei2$)
WritePreferenceString("Datei3", Datei3$)
ClosePreferences()
If OpenPreferences("Pfade.pref")
   ExaminePreferenceKeys()
   While NextPreferenceKey() 
       texte$ = texte$ + PreferenceKeyName() + " = " + PreferenceKeyValue() + #LF$
   Wend
   texte$ = texte$ +  #LF$
   Debug texte$
   ClosePreferences()
 EndIf
Ich hoffe, ich konnte dir etwas Erleuchtung bringen. Und gib nicht auf, wir sind ja auch noch für dich da.
PB 6.10
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von Axolotl »

Ich möchte mich mal wiederholen: (ach ne ich schicke nur den Link von früher)
TIPP: Die einzelnen Proceduren und Befehle sind mit kleinen Beispielen erklärt und das Ausführen der Beispiele helfen beim Verständnis.

Sollen Variablen überall gültig sein, dann verwende am Anfang Global <varName> <varName> ist z.B. File$ oder Number.i oder....
Auch hier hiflt es sich die Unterschiede von Global, Define, Shared und Static einmal durchzulesen und anhand von Beispielen zu verstehen.

Dazu die Alternative wäre, dass Du die benötigten Werte (Variablen) an Proceduren als Argument (Parameter) übergibst.
Ich empfehle (nochmal) dieses Kapitel zu studieren:
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: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von H.Brill »

Man sollte sich grundsätzlich angewöhnen, Variablen vorher zu deklarieren bzw. definieren
und nicht einfach bei Gebrauch on the fly aus dem Boden äh Tastatur zu stampfen. Es gibt Sprachen,
wo es eine saftige Fehlermeldung gibt, wenn Variablen vorher nicht deklariert worden sind.
Da ist PB noch sehr tolerant, bietet aber sonst viele Möglichkeiten. Der ganze Variablen-Scope von
PB wird aber den Anfänger eher verwirren. Ich würde da zum Anfang eher Global und Protected
vorschlagen. Oder in einer Procedure ein einfaches File1.s und im Hauptprogramm Global. Vergiß
das $-Postfix und schreibe lieber ein .s für String. Das $ stammt noch aus den grauen Vorzeiten, sowie
das Goto und Gosub:Return, mit dem man früher wunderbaren, unleserlichen Spaghetti-Code produzieren
konnte. Fred wollte da hilfreich für die GW- und QuickBasicler sein. Aber diese Zeiten sind ja vorbei.
PB 6.10
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von H.Brill »

Nachtrag :
Ich komme ja ursprünglich von der (X)Profan Ecke, wo ich vor etwa 30 Jahren mit der Windowsprogrammierung begann
und heute noch gerne kleine Tools damit schreibe. (X)Profan kennt ja von jeher nur globale Variablen und auch lokale,
wenn sie halt in einer Prozedur deklariert wurden und halt als Prozedurparameter bei PROC und ENDPROC. Ich habe bis
dato noch keine shared oder static deklarierte Variablen gebraucht. Ich habe jetzt auch keine riesig großen Programme
gemacht, wo man eben solche Spezialfälle, was static und shared betrifft, brauchte. Das konnte ich immer noch anders
lösen. Deshalb sagte ich ja oben, daß die beiden Variablentypen (Global und Protected) erst mal reichen sollten, damit
Anfänger nicht gleich den Überblick verlieren.
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: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo und guten Morgen @all,

Ich bin auf der Suche nach dem Fehler bei mir darauf gestossen, vielen Danke Axolotl,
genau das mit Shared habe ich nach ewigem suchen dann erst gesehen.
Und ich hab die meiste Zeit die diversen Beispiele durchgeackert, anstelle das gesammte gelesen.

Danke Euch allen, was muss ich für Euch ein Hornochs sein.

Code: Alles auswählen

Procedure ButtonHandler()
  ;Debug "Button click event on gadget #" + EventGadget()
  ; wenn man hier den EventGadget mit EventGadget() ermittelt und mit If... abfragt,
  ; hat man eine Universal-Procedure für alle anfallenden Button-Gadgets
  If EventGadget() = 3 
  
    Shared File1$
    Shared File2$
    Shared File3$

OK bezieht sich jetzt NUR gerade auf die Variable File1$ bis File3$ aber jetzt hab ich begriffen, dass diese
in der Prozedur wohl vorkommen, jedoch nicht zurückgegeben werden, sondern der Ursprungswert vorhanden bleibt.

Ich müsste mich wohl jetzt in Grund und Boden schämen, dass ich es nicht vor Augen sah, obwohl ich diese Punkte
"Variablen" immer und immer wieder geöffnet habe, in der Hilfe aber nie über das Shared gestolpert war.

Na ja, wir Berner sind schon für die Schweiz eher langsame Merker. Wie mag es wohl für andere sein?
Natürlich Euch allen ein riesiges Dankeschön, nicht einem Einzelnen natürlich.

Und ja, mit 66 Jahren, la la la la. Ich habe noch etwas Zeit, dennoch fühlt man sich manchmal alt, wenn man
merkt, diese alte Zeit habe ich am eigenen Leib miterlebt und nicht nur davon gehört.

Und NUN sehe ich auch endlich EIN, was Ihr mir die ganze Zeit versucht zu erklären.
Ich bin an einem Flicken Teppich und bastle mal da an einem Loch und mal da und verliere den Überblick, weil es keine Struktur hatte.

Nun werde ich wohl als Erstes versuchen das gerammt etwas aufzuräumen, damit ich Euch auch einen ersten Erfolg Präsentieren kann.
Dennoch bin ich noch nicht fertig, den Patch kann ich erstellen. Das Gegenteil, das klappt ja bekanntlich nicht. Wieso soll es auch, wenn man von
Falschen Grundlagen aus geht.

Und vielleicht habe ich das Teil-Projekt Patch Maker auch komplizierter angefangen und angegangen.
Sicher könnte man das ganze Strukturell extrem vereinfachen, aber das werde ich wohl im Laufe der Zeit
bei der Arbeit mit PB feststellen und sicher so den einen oder anderen Source Code von mir über den Haufen werfen müssen.

@H. Brill, das mit Global und Protected Variablen ist völlig ausreichen davon zu wissen, man kommt immer weiter hinein in eine Materie.
Und ja, ich glaube, wenn wir begonnen hätten mit Shared, Protect, Global und und und, hätte ich noch viel mehr den Faden verloren
als dass ich ihn bereits hatte.
das $-Postfix und schreibe lieber ein .s für String. Das $ stammt noch aus den grauen Vorzeiten, sowie
das Goto und Gosub:Return, mit dem man früher wunderbaren, unleserlichen Spaghetti-Code produzieren
konnte. Fred wollte da hilfreich für die GW- und QuickBasicler sein.
Genau dort war bei mir der Hase begraben, ich kannte mich noch genau mit denen aus, solch altes Gedöns war mir noch im
Hinterkopf begraben. Und das mag auch der Grund für das Hin und Her gewesen sein.

Langsam begreife ich auch, ich werde versuchen, mit alter Syntax etwas aufzuräumen, aber zu Beginn werde ich wohl
aus lauter Gewohnheit bei denen sein und versuchen diese beim weiter Arbeiten nach und nach zu ersetzen.

GW- und Q-Basic waren oft meine Begleiter, wenn ich etwas am Basteln war, bis mein Vater mit Pascal begonnen hatte.
Kleiner Junge am Rechner vom Vater die ersten Programme am Schreiben und hin und her Switchen zwischen Basic und Pascal.

Erster Teil Patch Maker klappt.
Teil zwei des Patch Maker am Schauen wo der Hase begraben ist
erster Teil vom Patch Maker etwas zurecht stutzen, damit er auch etwas anschaulicher wird.

Ich wünsche Euch allen einen perfekten Tag
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.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von Axolotl »

Ja, siehste, läuft doch.... :allright:
Aus meiner Sicht musst Du dich nicht (immer) Rechtfertigen oder Entschuldigen oder Erklären....
Jeder hat eine andere Vorgeschichte, eine andere Lerngeschwindigkeit und einen andren Stil. Das ist gut so.
Ich verstehe, dass die verschiedenen Tipps aus unterschiedlichen Richtungen (manchmal) verwirren. Trotzdem musst Du für dich entscheiden was Du wie umsetzen möchtest.
Wenn Du zum Beispiel Variablen deklarieren möchtest, bevor Du sie benutzt, dann verwende doch mal die folgende Option am Anfang der Hauptdatei.

Code: Alles auswählen

EnableExplicit 
Dann zwingt Dich der Compiler zur oben beschriebenen Vorgehensweise. Das mag nicht jeder, aber unbestrittener Vorteil ist, dass Du keine Fehler durch falsch geschriebene Variablennamen bekommst. (Einfach selbst ausprobieren.) Siehe auch Hilfe.

Nur so am Rande: Ich persönlich mag die String$ Variablen, weil ich gerne File$ und File verwende. Aber das kann man auch anders sehen und machen......
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
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: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo Axolotl,

definitiv ein Erfolg. Etwas den Code renovieren ist sicher nicht schlecht.
Hilft auch mir den Überblick zu bekommen.

Das mit
EnableExplicit
werde ich erneut anschauen.
Ich bin mir nicht sicher, dachte dass genau im vorhandenen Source ich
einen Error bekommen hatte, wegen der "Pattern".

Aber sicherlich auch eine Hilfe, und ich werde mich auch gerne hier
einlesen.

Nun komme ich natürlich zu den Bereichen mit dem Patch erstellen resp.
den patch benutzen.

Ich meine hier die beiden Prozeduren.

Denn ich habe beim Versuchen von der patchit Prozedur etwas entdeckt, was
mir noch nicht aufgefallen war. PokeS und PeekS und PokeS wird ja gerade
beim patcher verwendet

Code: Alles auswählen

Procedure patchit(File1$,File3$)
  Protected ByteOld.b , ByteDiff.b
  Protected PakMD5.s
  Protected PakSize.l, i.l
  Protected *Patch, *DataFile
  
  UseMD5Fingerprint() 
  UseLZMAPacker()
  
  OpenPack(0,File3$)
  *Patch = NextPackEntry(0)
  PakSize = PackEntrySize(0)
  PakMD5 =  PeekS(*Patch,32)
  
Da mir aufgefallen ist, dass auch da wieder MD5 sowie das Pack PlugIn benutzt wird,
hab ich die beiden recht weit oben angefügt.

Im Original sind file1.s und pak.s anstelle meiner file1$ und file3$
Die hab ich übernommen aus der GUI.

Die GUI für den patcher hab ich einfach die vom create patch übernommen.

Wo ich nun nicht ganz schlau werde,
PakMD5 = PeekS(*Patch,32)
verursacht einen Error,
[14:55:02] Executable gestartet.
[14:55:12] [ERROR] patchit.pbi (Zeile: 18)
[14:55:12] [ERROR] Ungültiger Speicherzugriff. (Lesefehler an der Adresse 1)
[14:55:18] Das Programm wurde beendet.
Ich dachte, es werden 33 Zeichen verwendet und nicht nur 32.

Muss ich im Vorfeld noch angeben, dass UTF-8 oder Unicode verwendet werden sollte?
Oder ist es bei den 32 Zeichen das Problem, dass ich anstelle ZIP Kompression LZMA verwendet hatte?
Oder hat der Speicherzugriff Fehler mit dem nichts zu tun, sondern woanders?

Hier stosse ich natürlich in einen Bereich, mit dem ich mich noch nicht beschäftigte.
Ich versuche zwischen createpatch und patchit als Prozedur die Parallelen zu finden.

Ich wünsche Euch allen einen schönen Nachmittag
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.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von Axolotl »

Hi,

ach ich dachte das wir das thema schon abgearbeitet hatten.....
Also: Was passiert hier eigentlich?
NextPackEntry() gibt keinen Zeiger zurück.
Bevor Du Speicher mit Peek oder Poke verwenden kannst muss er vorhanden sein, z.B.; AllocMemory() oder als @NotEmptyString$
Welchen der unterstützten Packer PlugIns Du verwendest ist egal.

BTW: Ich habe die beiden Proceduren mal (in meinem Stil) erstellt, weil ich überlegt hatte die Grundidee für ein Progrämmchen zu verwenden.....
Wenn Du es probierst, muss Du den Bereich am Ende (siehe hier) an deine Verzeichnisse anpassen und den jeweiligen Procedure Aufruf entkommentieren.
Also 1. CreatePackage() entkommentieren und laufen lassen.
Dann 2. PatchWithPackage() entkommentieren und CreatePackage() wieder kommentieren.

Code: Alles auswählen

CompilerIf #PB_Compiler_IsMainFile ; 
  Global Updater$ = "C:\Temp\Test_update.zip"   ; <- is created 
  Global OldFile$ = "C:\Temp\Test1.txt"         ; <- must exist 
  Global NewFile$ = "C:\Temp\Test2.txt"         ; <- must exist 

; ; this creates a Package (ZIP File) with NewFile$ and MD5 Checksum .... 
; Debug CreatePackage(Updater$, OldFile$, NewFile$) 

; ; this updates OldFile$ with NewFile$ from Package .... 
; Debug PatchWithPackage(Updater$, OldFile$) 
  
CompilerEndIf 
Tipp: Einfach mal die Packet-Datei mit einem Archiver Program (z.B.: 7-zip) anschauen.....

Und hier der Code der beiden Proceduren....

Code: Alles auswählen

UseZipPacker()        ; <-- plugin for Packer 
;                     ;     You need one of these: UseZipPacker(), UseLzmaPacker(), UseTarPacker(), UseBriefLZPacker(). 
UseMD5Fingerprint()   ; <-- plugin for Checksum 


#PACKAGE      = 1   
#FILE_Patch   = 1 

#MD5_SIZE = 32  ; size of MD5 is always 32 chars 

; --- Helper: Ask User for Confirmation ---
; 
Procedure Confirm(Message$)
  If MessageRequester("", Message$, #PB_MessageRequester_Info|#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes 
    ProcedureReturn #True 
  EndIf 
  ProcedureReturn #False 
EndProcedure


; create the file with the new Patch file 
; 
Procedure CreatePackage(Package$, OldFile$, NewFile$)  ; --- 
  Protected checksumOldFile$, checksumNewFile$, packedFile$ 
  Protected result, *fmem, fsize, bytes 

  If FileSize(Package$) > -1  ; existing file 
    If Confirm("Packet-Datei existiert bereits. " + #LF$ + "Überschreiben?") = #False  
      ProcedureReturn #False  ; don't overwrite the existing file 
    EndIf 
  EndIf 

  checksumOldFile$ = FileFingerprint(OldFile$, #PB_Cipher_MD5)  
  checksumNewFile$ = FileFingerprint(NewFile$, #PB_Cipher_MD5) 
  If checksumOldFile$ = checksumNewFile$ 
    ProcedureReturn #False 
  EndIf 
  
  If CreatePack(#PACKAGE, Package$) 
    ; read file to buffer 
    If ReadFile(#FILE_Patch, NewFile$) 
      fsize = Lof(#FILE_Patch) + #MD5_SIZE 
      *fmem = AllocateMemory(fsize) 
      If *fmem 
        bytes = ReadData(#FILE_Patch, *fmem + #MD5_SIZE, fsize - #MD5_SIZE)  ; keep the 32 byte for md5 
        If bytes 
          Debug "Number of bytes read: " + Str(bytes) + "  " + Str(fsize - #MD5_SIZE) 
          PokeS(*fmem, checksumOldFile$, #MD5_SIZE, #PB_String_NoZero|#PB_Ascii)  ; Writes the strings in ascii

          packedFile$ = ReplaceString(NewFile$, #PS$, "?") ; change PathSeparator with some char not allowed in filenames 
          AddPackMemory(#PACKAGE, *fmem, fsize, packedFile$) 
          result = #True 
        EndIf 
        FreeMemory(*fmem) 
      EndIf 
      CloseFile(#FILE_Patch)
    EndIf 
    ClosePack(#PACKAGE) 
  EndIf 
  ProcedureReturn result ; default is #False 
EndProcedure 


; patch the old file with the new file from Package 
; 
Procedure PatchWithPackage(Package$, OldFile$)  ; --- 
  Protected checksumOldFile$, packed$ 
  Protected result, *fmem, fsize 

  If FileSize(OldFile$) = -1  ; not existing old file 
    ; ERROR 
    ProcedureReturn #False 
  EndIf 

  checksumOldFile$ = FileFingerprint(OldFile$, #PB_Cipher_MD5)  

  If OpenPack(#PACKAGE, Package$) 
    If ExaminePack(#PACKAGE) 
      While NextPackEntry(#PACKAGE)  
        fsize = PackEntrySize(#PACKAGE) 
;Debug "Name: " + PackEntryName(#PACKAGE) + ", Size: " + fsize 

        *fmem = AllocateMemory(fsize) ;, #PB_Memory_NoClear)  
        If *fmem 
          If UncompressPackMemory(#PACKAGE, *fmem, fsize) <> -1 
            packed$ = PeekS(*fmem, #MD5_SIZE, #PB_Ascii)            
            If checksumOldFile$ = packed$  ; 
              If CopyFile(OldFile$, OldFile$ + ".bak") 
                If CreateFile(#FILE_Patch, OldFile$) 
                  WriteData(#FILE_Patch, *fmem + #MD5_SIZE, fsize - #MD5_SIZE) 
                  CloseFile(#FILE_Patch)  
                  result = #True  ; 
                EndIf 
              EndIf 
            EndIf 
          EndIf         
          FreeMemory(*fmem) 
        EndIf 
      Wend
    EndIf 
    ClosePack(#PACKAGE) 
  EndIf 
  ProcedureReturn result ; default #False 
EndProcedure 


CompilerIf #PB_Compiler_IsMainFile ; create a file .... 

  Global Updater$ = "C:\Temp\Test_update.zip"   ; <- is created 
  Global OldFile$ = "C:\Temp\Test1.txt"         ; <- must exist 
  Global NewFile$ = "C:\Temp\Test2.txt"         ; <- must exist 

; ; this creates a Package (ZIP File) with NewFile$ and MD5 Checksum .... 
; Debug CreatePackage(Updater$, OldFile$, NewFile$) 

; ; this updates OldFile$ with NewFile$ from Package .... 
; Debug PatchWithPackage(Updater$, OldFile$) 
  
CompilerEndIf 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Antworten