Page 1 sur 3

Ressources

Publié : ven. 02/janv./2009 19:34
par KrisJNT
Bonjour à tous !

Je suis sûr que cette question a déjà obtenu sa solution... Mais après une recherche sur le forum, je ne parviens pas à trouver la réponse.

Voila :
Je cherche à utiliser dans mon programme les fichiers que j'ai déjà inclus dans mon exe. Par exemple, j'aimerai mettre une image dans un popupmenu (ça, je sais déjà faire), et cette image se trouverai dans mon exe.

Sauf que, je ne sais pas comment faire !

Pour être un peu plus lucide, je vous donne un exemple en C++ avec Qt :

":/Icons/mon_icones.ico" renvoie l'icône inclue dans l'exécutable. On peut ainsi s'en servir comme on veut ! Et ça marche avec des BMP, AVI, WAV, des textes, etc, bref toutes les ressources existantes.

Si vous avez une solution, merci pour votre aide ! :D

KrisJNT

Re: Ressources

Publié : ven. 02/janv./2009 19:44
par Anonyme2
KrisJNT a écrit :Bonjour à tous !

Je suis sûr que cette question a déjà obtenu sa solution... Mais après une recherche sur le forum, je ne parviens pas à trouver la réponse.

Voila :
Je cherche à utiliser dans mon programme les fichiers que j'ai déjà inclus dans mon exe. Par exemple, j'aimerai mettre une image dans un popupmenu (ça, je sais déjà faire), et cette image se trouverai dans mon exe.

Sauf que, je ne sais pas comment faire !
Tes fichiers images seront inclus dans l'exe dans la section data (datasection) avec includebinary

Fais une recherche sur le forum sur le forum avec includebinary et tu trouveras des exemples.

Pour une image, tu utilisera catchimage au lieu de loadimage.

Publié : ven. 02/janv./2009 21:54
par Droopy
Voici le code de la DroopyLib qui traite des ressources :

Code : Tout sélectionner

; 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)
C'est beaucoup plus simple qu'avec includebinary quand tu as beaucoups de fichier à inclure (de plus ils ne sont pas chargés en mémoire)

Ce code utilise l'api win32, donc ne fonctionne pas sous nunux

Publié : sam. 03/janv./2009 8:57
par Anonyme2
Droopy a écrit :Voici le code de la DroopyLib qui traite des ressources :

C'est beaucoup plus simple qu'avec includebinary quand tu as beaucoups de fichier à inclure (de plus ils ne sont pas chargés en mémoire)

Ce code utilise l'api win32, donc ne fonctionne pas sous nunux
D'accord avec toi Droopy sur le fait qu'avec les ressources, seul ce qui est utilisé est chargé en mémoire.

Pour les includebinary, je trouve ça très pratique, ça marche très bien, j'ai utilisé includebinary pour mon installeur GDI+ (plus de 600 fichiers) en compactant l'ensemble en 4 fichiers puis en extrayant les fichiers voulus des archives (1 archive par thème).

Publié : sam. 03/janv./2009 9:50
par Backup
tu as donc les 2 réponses ci dessus , j'ajouterai que donc il ne faut pas confondre

ressource (fichier *.RC)
(fichier *.RES en visual basic)
(fichier *.RSC sur Atari ST ... Kressource )
un fichier externe d'un format particulier qui contient des données,images,etc.. pour ton prg (voir Droopy lib)

et les includebinary , qui dont des données (images,son,data) inclues dans ton prg par l'utilisation de fonction spécifique du Purebasic!!!

Publié : sam. 03/janv./2009 11:33
par KrisJNT
OK, merci ! :D
Je vais étudier ces solutions de prêt et si je m'en sors pas je n'hésiterai pas à redemander ! ^^

Merci encore !

Publié : jeu. 27/août/2009 8:48
par Kwai chang caine
Bon comme dab, j'suis le seul a pas arriver a faire démarrer la bagnole :oops:

J'ai essayer de faire tourner le super code de DROOPY et ça marche pas.
J'ai remplacé le mot IMAGE par le chemin d'une BMP et ça me repond

Code : Tout sélectionner

Memory pointer is null !!
Moi aussi j'voudrais conduire.....moi aussi s'il vous plait...s'il vous plait !!!! :cry:

Publié : jeu. 27/août/2009 9:54
par Kwai chang caine
Bon ça y'ai, j'ai trouvé la clef du coffre...peut etre qu'en poussant les sieges de derriere je pourrais atteindre le volant :?

Je viens de comprendre, mais c'est vraiment pas evident, parceque deja y'a pas beaucoup de sujet la dessus.....et en plus y'a pas vraiment de codes complets parlant de la chose....

Alors deja, j'arrivais pas a créer mon RES :oops:

Je viens de comprendre que dans

Code : Tout sélectionner

IMAGE RCDATA "c:\\bmp.bmp"
IMAGE est le nom de la ressource et aussi de bien mettre les "\\"
Ca a marché, mais j'ai pas compris pourquoi VB me le classe dans un dossier "10", je sais pas ou il le chope ce "10" ???? :roll:
Et en plus il me le met americain 8O
Je ne sais pas si c'est important....mais KCC il est français....y cause un peu la langue de "cheques pire" sous la torture ....mais il est pas americain :?

Publié : jeu. 27/août/2009 10:06
par Kwai chang caine
Bon je crois que deja je suis devant le volant, et j'ai trouvé un trousseau de clef...mais est que y'aura la clef de contact dedans ??? :?

Je viens de comprendre que le code de DROOPY est pas ce que je cherche.....son code y sert a extraire une ressource, enfin je crois.

Moi ce que je cherche c'est à l'inclure par le code et non pas avec le panneau du compilateur .... :roll:

Publié : jeu. 27/août/2009 10:24
par Backup
en principe il te faut creer ton RC (ressource) avec un prg externe

genre "Ressource Hacker" ensuite tu pourra exploiter son contenu
avec la Droopy lib (de memoire.....) :)


ps : visual basic a surement un utilitaire pour generer des *.Res


pour rappel , un fichier ressource (RC,RES ...) est un fichier d'un format particulier , qui contient des images,sons, ligne de texte d'un prg etc ...

pour le fabriquer , il existe des utilitaires ......


ensuite il faut joindre ce fichier ressource externe avec le prg qui fait appel a ses medias ....

la droopy lib semble contenir tout ce qu'il faut pour acceder aux données Medias , se trouvant dans un fichier ressources !

fichier ressources qui est toujours editable grace a Ressource Hacker par exemple ;)



ps : etait ce vraiment utile de creer un sondage pour ça ?? :roll:

Publié : jeu. 27/août/2009 10:43
par Kwai chang caine
etait ce vraiment utile de creer un sondage pour ça ??
Moi j'ai rien fait !!! :lol:

Merci DOBRO pour ton aide 8)
Mais la question que je me pose maintenant, c'est une fois que t'as mis ton fichier RC dans le panneau ressource du compilateur, apparement au lancement il créé le fichier RES, mais ou il l'ecrit avec PORC ???
Il le garde pas ????

Et peut on charger directement un fichier RES deja créé par PORC ou RC ???

Publié : jeu. 27/août/2009 11:00
par Backup
lit attentivement ce topic

j'ai corrigé le lien de Droopy, qui n'etait plus bon a cause du changement de Forum ;)

http://www.purebasic.fr/french/viewtopi ... 9167#39167

voila tu devrai trouver tes infos !!

ps il te faudra la Droopy lib :)

Publié : jeu. 27/août/2009 11:16
par gnozal
Kwai chang caine a écrit :Et peut on charger directement un fichier RES deja créé ...
Oui.

Code : Tout sélectionner

Import "LeFichierDeKCC.res" 
EndImport

Publié : jeu. 27/août/2009 12:55
par Kwai chang caine
lit attentivement ce topic
j'ai corrigé le lien de Droopy, qui n'etait plus bon a cause du changement de Forum
http://www.purebasic.fr/french/viewtopi ... 9167#39167
voila tu devrai trouver tes infos !!
ps il te faudra la Droopy lib
Merci DOBRO
Cette fois, je crois que je vais pouvoir faire un tour de bagnole comme les copains :D

Donc je recapepete.....enfin je pense en ecrivant. :roll:

Y va etre content CHRIS.......deja que j'ecris pour rien dire...maintenant si j'ecris aussi ce que je pense :D

C'est trop cool, on fait donc un fichier TXT dans lequel on ecrit les instruction de "compilation", style

Code : Tout sélectionner

NOMDELARESSOURCE RCData "CheminFichierACompiler"
Apres on le nomme en ".rc"
On le "compile" grace a PORC.EXE et sa DLL (Y sont mariés, et ils sont tristes l'un sans l'autre) ou bien avec RC.EXE tout seul du rep VB6 (Encore un celibataire)

On met tout sous la racine du c: (par exemple)
Et on ecrit dans la console windows

Code : Tout sélectionner

C:\>porc NomFichierInstruction.rc
ou

Code : Tout sélectionner

C:\>rc NomFichierInstruction.rc
Et hop un fichier RES tout neuf, il apparait :D

Apres comme le dit le grand GNOZAL, on peut l'inserer, comme un includefile grace a la commande

Code : Tout sélectionner

Import "LeFichierDeKCC.res" 
EndImport
Apres il est dedans le ventre de l'executable :D
Mais pas obligé d'attendre 9 mois pour qu'il ressorte.....non non non :roll:
Car y'a le gynecologue en chef DROOPY qui a trouvé un code que l'on pourrait nommé FORCEPS....et qui peut faire sortir le ressource quand il veut.....trop fort ce "Doc gyneco...." :roll:

C'est magique :D

Bon je vais faire les essais, et j'espere au moins pouvoir faire le tour du paté de maison avec la bagnole :D
En attendant merci à tous de votre aide 8)

J'ai le meme probleme avec VB, maintenant il faudrait que je trouve un code pour inserer le RES par ligne de commande.....
Mais j'suis pas a la veille de manger de l'oie :?
Parce que VB ......lui.....il aime pas le doc gyneco et ses FORCEPS :?

Mais si quinquin, y connait une combine......oubliez pas ...3615 code KCC :D

Encore merci

Publié : jeu. 27/août/2009 13:33
par Backup
soit dit en passant
tu as aussi la possibilité d'utiliser les includes de Purebasic
au lieu d'un fichier ressources (mais ça grossi l'executable)

sinon il reste l'utilisation d'une archive
genre Zip , et tu pioche ce que tu as besoin dedans !

ps t'es pas obligé de mettre une extention *.zip a un zip !
tu peux l'appeler *.Rsc , et en fait utiliser une librairie pour acceder au contenu du zip
de prime abords, tu sera le seul a savoir que c'est un ZIP !! :lol: