Page 1 sur 1

Resource

Publié : ven. 25/nov./2005 23:37
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

Publié : sam. 26/nov./2005 9:54
par nico
Pure basic fait tout ça déjà avec IncludeBinary. :roll:

Publié : sam. 26/nov./2005 10:11
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!

Publié : sam. 26/nov./2005 10:29
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à!

Publié : sam. 26/nov./2005 10:33
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.

Publié : sam. 26/nov./2005 12:36
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.

Publié : sam. 26/nov./2005 12:38
par Backup
ça reviens a faire une archive finalement ... 8O

Publié : sam. 26/nov./2005 12:38
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.

Publié : sam. 26/nov./2005 12:45
par Backup
on a posté en meme temps !! :lol:

Publié : sam. 26/nov./2005 16:39
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.