Modification resource

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Modification resource

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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?
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

ca fait un super point de départ
je m'étais jamais penché là dessus ^^

Dri :D
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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)
Répondre