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é
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

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

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)