Accéder à un fichier ressource

Fermé
Signaler
Messages postés
213
Date d'inscription
mercredi 9 janvier 2013
Statut
Membre
Dernière intervention
13 mai 2016
-
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
-
Bonjour,
j'ai besoin d'accéder à un fichier ressource (RCDATA dans un .rc), pour le copier dans le dossier temporaire et l'utiliser plus tard.
J'ai essayé le chemin ":/ressource.wav" avec fopen mais ça ne fonctionne pas.
Il y a bien un moyen? Une fonction, un chemin d'accès...

Merci beaucoup!

1 réponse

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
Bonjour,
Si tu souhaites copier le contenu d'un fichier dans un autre, il faut te la créer tout seul : une boucle for, tu lis depuis le fichier et colle dans l'autre.
Messages postés
213
Date d'inscription
mercredi 9 janvier 2013
Statut
Membre
Dernière intervention
13 mai 2016
14
J'ai mis MAKEINTRESOURCE(1) et remplacé la ligne du fichier rc par
1 RCDATA "fichier.wav"

J'ai l'erreur: "cast from 'CHAR*' to 'WORD' loses precision".
Où il voit ce char et ce word?
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
956
Peux-tu montrer le code qui génère ce message, et indiquer la ligne qui le génère.
Messages postés
213
Date d'inscription
mercredi 9 janvier 2013
Statut
Membre
Dernière intervention
13 mai 2016
14
HMODULE g_hModDll;
HRSRC hRscr = FindResource(g_hModDll, MAKEINTRESOURCE(1), MAKEINTRESOURCE(RT_RCDATA));

C'est la deuxième ligne qui pose problème.
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
956
Dans ce code, ton handle hModDll n'est pas initialisé, juste déclaré. Cela peut être l'origine du message d'erreur.

Comme indiqué dans mon premier message, tu dois obtenir ce handle sur le module avec GetModuleHandle.

https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea?redirectedfrom=MSDN

Si le module n'est pas déjà chargé par ton programme ou linké au démarrage, essaye d'obtenir le handle avec LoadLibrary:

https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya?redirectedfrom=MSDN
https://docs.microsoft.com/en-us/windows/win32/dlls/using-run-time-dynamic-linking?redirectedfrom=MSDN (exemple)

Une fois que tu as ce handle, tu peux le passer à FindResource.

Plus d'infos sur la différence entre "Run-Time Dynamic Linking" et "Load-Time Dynamic Linking" sous Windows là:

https://docs.microsoft.com/en-us/windows/win32/dlls/run-time-dynamic-linking?redirectedfrom=MSDN
https://docs.microsoft.com/en-us/windows/win32/dlls/load-time-dynamic-linking?redirectedfrom=MSDN

Dal
Messages postés
5677
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 décembre 2021
956
Note aussi que si tu veux juste jouer le son contenu dans le module et non pas l'extraire pour le copier quelque part, tu peux utiliser PlaySound() directement avec le handle obtenu vers le module et son numéro identifiant :

PlaySound(MAKEINTRESOURCE(1), g_hModDll, SND_RESOURCE);

https://docs.microsoft.com/en-us/previous-versions//dd743680(v=vs.85)?redirectedfrom=MSDN

... cela t'évite devoir ensuite utiliser FindResource, LoadResource, LockResource, SizeofResource, copier les données en mémoire ... et donc dupliquer les données stockées sur ton disque. Après tout, c'est à cela que servent les .dll.

Enfin, c'est toi qui vois pourquoi tu veux le faire :-)


Dal