Seite 1 von 1

Warum muss der Compiler gepatcht werden?

Verfasst: 06.02.2007 21:35
von mknjc
Morgen,

ich bin grade dabei ein, zwei kleine Tools für PureBasic zu entwickeln und lese mir grade den Source von jaPBe und dem PureBasic Editor durch.

Jetz ist mir eine Procedure aufgefallen:

Code: Alles auswählen

Procedure PatchPB()
  Result=#False
  in$= CompilerPath$+"pbcompiler.exe"
  out$= CompilerPath$+"PBCompiler-jaPBe.exe"
  ;
  len=FileSize(in$)
  If len>0
    ;
    PBVersion$ = GetPBCompilerVersion(in$) ; gnozal
    ;
    Mem_PbPatch=AllocateMemory(len+10)
    *start.Byte=Mem_PbPatch
    *buf.Byte=*start
    If *buf
      If ReadFile(#File_PBPatch,in$)
        ReadData(*buf,len)
        CloseFile(#File_PBPatch)
      EndIf
      For i=1 To len
        ;lcclnk.exe
        If *buf\b=#LinkerFirstChar1 Or *buf\b=#LinkerFirstChar2
          If CompareMemoryString(*buf,#Linker,#True,10)=0
            *buf\b='f' 
          EndIf
        EndIf
        ; If *buf\b='p' Or *buf\b='P'
          ; If CompareMemoryString(*buf,"PureBasic v",#True,11)=0
            ; *ver.BYTE=*buf+11
            ; PBVersion$=""
            ; While *ver\b<>0 And *ver\b<>13 And *ver\b<>10 And *ver\b<>'-'
              ; PBVersion$+Chr(*ver\b)
              ; *ver+1
            ; Wend
            ; PBVersion$=Trim(PBVersion$)
          ; EndIf
        ; EndIf
        *buf+1
      Next
      
      If FileSize(out$)>0
        If DeleteFile(out$)=0
          ;japbe läuft schon->alles OK
          FreeMemory(Mem_PbPatch)
          ProcedureReturn #True
        EndIf
      EndIf
      
      If CreateFile(#File_PBPatch,out$)
        WriteData(*start,len)
        CloseFile(#File_PBPatch)
        
        If SavePackMem(?FakeLCC, CompilerPath$+#FLinker)
          Result=#True
        EndIf
      EndIf
      FreeMemory(Mem_PbPatch)
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure
Jatzt frag ich mich: ÄhÖhOhÄhhh?
Was soll dass denn was hat gnozal bzw. GPI denn da gebaut warum muss der Compiler denn gepacht werden und was wird gepatcht?

Hoffentlich kann mir das einer erklären.

Mfg mknjc

[Edit:]So da kommen die Konstanten.

#LinkerFirstChar1 = 'p'
#LinkerFirstChar2 = 'P'
#Linker = "polink.exe"
#FLinker = "folink.exe"

Die Versionsnummer wird nicht geändert. Das scheint irgentwas mit dem polinker zu tun zu haben da jaPBe eine Datei namens folink.exe anlegt.

Aber warum wird nicht einfach die Datei geöffnet und alle polink.exe in folink.exe umbenannt und warum brauch jaPBe diese folink?

Ach ts-soft ich glaube nicht das man um eine Datei zu Kopieren irgentwelche $50 oder $70 in $66 ändern.

[/Edit]

Verfasst: 06.02.2007 21:43
von DarkSoul
gib doch mal die werte der konstanten bekannt. ich tippe mal, da wird was an der veersionsnummer geändert, wenn ich mir das auskommentierte etwas genauer ansehe. vielleicht passt die nicht mit japbe oder so

Verfasst: 06.02.2007 21:55
von ts-soft
PB-IDE genauso wie jaPBe starten automatisch den PBCompiler und stellen
den in Wartestellung. Damit die IDE und jaPBe nicht ins schleudern kommen,
wird der Compiler umbenannt. So in etwa, da wird nichts an der PBCompiler.exe geändert :mrgreen:

Verfasst: 07.02.2007 01:44
von Deeem2031
ts-soft hat geschrieben:PB-IDE genauso wie jaPBe starten automatisch den PBCompiler und stellen
den in Wartestellung. Damit die IDE und jaPBe nicht ins schleudern kommen,
wird der Compiler umbenannt. So in etwa, da wird nichts an der PBCompiler.exe geändert :mrgreen:
Klar wird da was an der Exe verändert. Natürlich wird die vorher kopiert, aber dann wird in der exe nach dem namen der Linker-Exe gesucht und geändert, wodurch dann halt ein anderer Linker gestartet wird. (vorher "polink.exe" danach "folink.exe")

(Dachte eigentlich, dass es allgemein bekannt ist, dass JaPBe das macht)