Page 1 sur 1

Modification resource

Publié : ven. 22/sept./2006 12:16
par Droopy
Ce code permet de modifier une resource de type binaire dans un exe.

Code : Tout sélectionner

;/ PureBasic 3.94 / Droopy 22/09/06
;/ Met à jour des resources dans un exe
;/ Prérequis : Ne fonctionne qu'avec un fichier intégrant déjà des ressources.


Procedure InsertResource(File.s,Resource.s,ResourceName.s,DeleteExistingResources	)
  
  Size=FileSize(Resource)
  If Size>0
     
    *InsertResourcePtr=AllocateMemory(Size)
    No=ReadFile(#PB_Any,Resource)
    ReadData(*InsertResourcePtr,Size)
    CloseFile(No)
     
    hUpdateRes = BeginUpdateResource_(File,DeleteExistingResources) 
    If hUpdateRes
      If UpdateResource_(hUpdateRes,#RT_RCDATA,ResourceName,#LANG_NEUTRAL,*InsertResourcePtr,Size)
        Ret=1
      EndIf
      EndUpdateResource_(hUpdateRes, #False) 
      FreeMemory(*InsertResourcePtr)
      ProcedureReturn Ret
    EndIf
  EndIf
  
EndProcedure

Publié : ven. 22/sept./2006 16:17
par nico
Est-ce que l'exe peut s'auto-modifier et les ressources modifiées sont elles accessibles tout de suite ou faut-il relancer l'exe?

Publié : ven. 22/sept./2006 18:59
par Droopy
nico a écrit :Est-ce que l'exe peut s'auto-modifier et les ressources modifiées sont elles accessibles tout de suite ou faut-il relancer l'exe?
Je suis pas arrivé à modifier les resources incluses dans l'exe quand il est lancé :cry:

Si tu as une idée je suis preneur

Publié : ven. 22/sept./2006 19:16
par Dr. Dri
ca fait un super point de départ
je m'étais jamais penché là dessus ^^

Dri :D

Publié : ven. 22/sept./2006 19:57
par Thyphoon
ma question va paraitre peut être idiote ! mais dans ce cas là qu'est ce qu'on appel resource ? c'est une image ou info qui est inclu dans le code sous forme data ? je nbe vois pas trop comment ça marche.

Publié : ven. 22/sept./2006 20:15
par Dr. Dri
ce sont des données inclues dans ton exe qui ne se chargent pas au lancement de ton programme (contrairement à includebinary)

les ressources peuvent avoir un type particulier (chaines, icones, menus etc) et peuvent même se décliner en plusieurs langues.
elles sont chargées en mémoire quand on décide de les charger...

Dri ;)

Publié : ven. 22/sept./2006 20:18
par Thyphoon
Dr. Dri a écrit :ce sont des données inclues dans ton exe qui ne se chargent pas au lancement de ton programme (contrairement à includebinary)

les ressources peuvent avoir un type particulier (chaines, icones, menus etc) et peuvent même se décliner en plusieurs langues.
elles sont chargées en mémoire quand on décide de les charger...

Dri ;)
Merci beaucoup pour ces précisions :D je suppose que pour les exploiter dans l'executable il doit y avoir d'autre fonction..c'est interessant ça.

Publié : ven. 22/sept./2006 21:08
par Droopy
Voila le code des fonctions que j'avait codé pour PureBasic 3.94 permettant la manipulation des resources.

Code : Tout sélectionner

;{ Resource (Start)                                              
;/ Droopy 
; PureBasic 3.94 25/11/05

; Create a File with RC Extension And include it as RC_DATA Resource Type 
; Path can be absolute Or relative
; Exemple :
            ; REG RCData "C:\WINDOWS\REGEDIT.EXE"
            ; SON RCData "son.wav"
            ; Image RCData "image.bmp"

;/ SaveResourceAs(Name.s,File.s) Save the resource as a file
;/ GetResourcePointer(Name.s) is usefull with PureBasic CatchXXX functions (CatchImage / CatchSound ... )

ProcedureDLL SaveResourceAs(Name.s,File.s)
  
  ; (Use GetModuleHandle_ if you want to specify another file)
  
  HandleResource= FindResource_(0,@Name,#RT_RCDATA)
  If HandleResource
    HandleGlobalMemoryBlock=LoadResource_(0,HandleResource) 
    PointerFirstByteOfTheResource=LockResource_(HandleGlobalMemoryBlock)
    
    ; Get size of the resource
    Size= SizeofResource_(handle,HandleResource)
    
    ; Save the file
    FileId=OpenFile(#PB_Any,File)
    If FileId
      WriteData(HandleGlobalMemoryBlock,Size)
      CloseFile(FileId)
    EndIf
    
    ; Test if the file is written
    If FileSize(File)=Size 
      ProcedureReturn 1
    EndIf
  EndIf
  
EndProcedure

ProcedureDLL GetResourcePointer(Name.s)
  
  ; (Use GetModuleHandle_ if you want to specify another file)
  
  HandleResource= FindResource_(0,@Name,#RT_RCDATA)
  If HandleResource
    HandleGlobalMemoryBlock=LoadResource_(0,HandleResource) 
    PointerFirstByteOfTheResource=LockResource_(HandleGlobalMemoryBlock)
    
    ProcedureReturn HandleGlobalMemoryBlock
  EndIf
EndProcedure

ProcedureDLL GetResourceSize(Name.s)
  
  ; (Use GetModuleHandle_ if you want to specify another file)
  
  HandleResource= FindResource_(0,@Name,#RT_RCDATA)
  If HandleResource
    HandleGlobalMemoryBlock=LoadResource_(0,HandleResource) 
    PointerFirstByteOfTheResource=LockResource_(HandleGlobalMemoryBlock)
    
    ; Return the size of the resource
    Size= SizeofResource_(Handle,HandleResource)
    ProcedureReturn Size
  EndIf
  
EndProcedure

;/ Test
; CatchImage(0,GetResourcePointer("IMAGE"))
; OpenWindow(0,0,0,240,240,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ImageGadget")
; CreateGadgetList(WindowID(0))
; ImageGadget(0,20,20,200,200,UseImage(0),#PB_Image_Border)  
; SaveResourceAs("REG","d:\Out.exe")
; InitSound()
; CatchSound(0,GetResourcePointer("SON"))
; PlaySound(0)
; Delay(2000)


;} Resource (End)