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

Resource

Message par Droopy »

Ces fonctions permettent d'inclure des fichiers dans l'EXE
et ensuite de les utiliser en tant que son / image ou encore
de les extraire sur le disque dur.

Créez un ficher texte ayant pour extension RC
Inclure ce fichier en tant que ressource, type RCData
Le chemin des fichiers peut être relatif ou absolu

Exemple de fichier RC :
REG RCData "C:\WINDOWS\REGEDIT.EXE"
SON RCData "son.wav"
IMAGE RCData "image.bmp"

Code : Tout sélectionner

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

Message par nico »

Pure basic fait tout ça déjà avec IncludeBinary. :roll:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'avoue que moi non plus, je ne vois pas trop l'avantage par rapport aux commandes natives de PB.

A part, peut-être, celui d'expliquer comment elles fonctionnent!
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

A part, peut-être, celui d'expliquer comment elles fonctionnent!
Même pas, par exemple si tu charges une icone en ressource avec le bon type, icon dans ce cas, en une ligne seulement tu charges ton icône; t'as pas du tout besoin de FindResource et tout le tra là là!
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

L'avantage serait de pouvoir manipuler les données comme de vrais ressources et non comme des binaires ;et de pouvoir les modifier avec un compilateur de ressource par exemple, encore faut-il utiliser les bons types.

[Edit]

On peut par exemple inclure des boites de dialogues comme l'a montré une personne sur le Forum Anglais, mais c'est pareil ça complique tout; ça devient pas forcément un avantage car on est obligé de mixer api et commandes Pb et ça oblige de faire une procédure de traitement à part. Beaucoup plus simple à faire sans ressource.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

L'aventage est tout vu. Tant que tu n'utilise pas la resource, elle n'est pas chargée en mémoire. Alors qu'avec un Catch ou même IncludeBinary, le fichier est chargé en mémoire.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ça reviens a faire une archive finalement ... 8O
Dernière modification par Backup le sam. 26/nov./2005 12:40, modifié 1 fois.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Pour un projet j'ai besoin d'inclure des fichiers que j'extrais dans temp puis exécute.

J'utilise ce type de code :

Code : Tout sélectionner

DataSection 
StartFile1: 
IncludeBinary "C:\windows\regedit.exe" 
EndFile1: 
EndDataSection 

Size=?EndFile1-?StartFile1

CreateFile(0,"c:\regedit.exe")
WriteData(?StartFile1,Size)
CloseFile(0)
La fonction SaveResourceAs me fait la même chose en une ligne.
Je trouve ça pratique d'inclure mes images / son comme ça, et de récupérer le pointeur avec GetResourcePointer.

L'avantage des ressources ( lu sur le forum anglais ) est que seule la partie code est chargée en mémoire contrairement à includebinary.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

on a posté en meme temps !! :lol:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je retire ce que j'ai dit, effectivement c'est mieux surtout dans l'exemple que tu donnes Droopy avec un programme qui contient un exe!

mais pour ce qui est des icones,curseurs,bitmap,font,html,avi etc.., il y a des commandes qui permettent de charger directement la ressource, c'est à cela que sert les différents types.
Répondre