IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Embarquer un fichier dans l'exécutable


Sujet :

Visual C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Embarquer un fichier dans l'exécutable
    Bonjour,

    Tout d'abord, félicitations pour ce site qui m'a appris d'innombrables choses. Je viens de m'inscrire car je ne trouve pas de réponse à mon problème, que ce soit sur ce forum ou ailleurs sur la toile.

    Je suis sous Visual Studio 2008, et je programme en C++. Je cherche à embarquer un fichier directement dans l'exécutable, et à pouvoir y accéder lors de l'exécution (j'imagine en le stockant dans un fichier temporaire). j'avais il y a quelques temps trouvé un site (que j'ai entre temps perdu ) décrivant une technique avec l'API Win32, mais en l'occurrence, mon projet repose sur MFC, et je ne connais pas du tout Win32 (non pas que je sois une star avec MFC, hein ).

    Donc voila, si quelqu'un a une solution, ou un lien vers un tutorial, ça m'arrangerait.

    merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    En gros, le plus simple est de le joindre en tant que ressource, puis utiliser des fonctions associées pour l'extraire.
    J'ignore s'il y a des fonctions spécifiquement MFC pour ça, mais sous Win32 on utilise FindResource(), LoadResource(), LockResource()...

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En gros, le plus simple est de le joindre en tant que ressource, puis utiliser des fonctions associées pour l'extraire.
    J'ignore s'il y a des fonctions spécifiquement MFC pour ça, mais sous Win32 on utilise FindResource(), LoadResource(), LockResource()...
    Comment tu fais pour créer un fichier ressource ... qui ne soit pas une ressource (un binaire quelconque en fait) ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Je n'ai pas vérifié depuis un moment, mais il me semble que Add Resource -> Import -> Type: All files marche.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je n'ai pas vérifié depuis un moment, mais il me semble que Add Resource -> Import -> Type: All files marche.
    Avec le type RT_RCDATA, j'imagine.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Je ne sais pas, mais je sais que dans l'éditeur de ressources, le type est une chaîne (personnalisable), pas une constante comme RT_BITMAP.

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour toutes vos réponses !! Après quelques essais, je suis bloqué avec ce code, qui est censé sauvegarder la ressource venant de triplets.chm dans le fichier temporaire c:\aide.chm :

    dans mon fichier .rc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IDR_DOC1  doc  "C:\\Documents and Settings\\USER\\Mes documents\\Visual Studio 2008\\Projects\\Triplets\\Debug\\triplets.chm"
    et dans mon .cpp, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    HRSRC resHandle;
    resHandle = FindResource(GetModuleHandle(0),(LPCTSTR)IDR_DOC1, LPCTSTR)RT_RCDATA);
     
    HGLOBAL handleGbl;
    handleGbl = LoadResource(GetModuleHandle(0), resHandle);
     
    if(handleGbl)
    {
    	BYTE *pdata = (BYTE*) LockResource(handleGbl);
    	if(pdata)
    	{
    		ofstream outFile("c:\\aide.chm", ios::out);
    		outFile << pdata;
    		outFile.close();
    	}
    	else
    		AfxMessageBox(_T("impossible d'écrire dans le fichier !!"), MB_OK|MB_ICONINFORMATION, 0);
    }
    else
    	AfxMessageBox(_T("ressource indisponible !!"), MB_OK|MB_ICONINFORMATION, 0);
    et j'ai toujours le message "ressource indisponible !!". j'en déduis (ais-je tort ?) que c'est le FindResource(GetModuleHandle(0),(LPCTSTR)IDR_DOC1,(LPCTSTR)RT_RCDATA); qui pose problème. plus précisément, (LPCTSTR)IDR_DOC1 ne doit pas désigner la bonne ressource.

    Je précise que (sous Visual Studio 2008), j'ai ajouté mon fichier CHM comme ressource en faisant un clic bouton droit dans l'explorateur de solutions sur Fichiers de ressource, puis Ajouter>Ressource... puis Importer, et je sélectionne mon fichier .chm. Ensuite, dans la boite de dialogue "Type de ressource personnalisée", je mets comme type de ressource DOC1... pas sur de cette étape d'importation de ressources, en fait.

    n'étant pas un expert du développement sous Windows, je suis un peu bloqué... une idée ?

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je n'ai pas fait le test, mais essaies de remplacer doc par RT_RCDATA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IDR_DOC1  RT_RCDATA  "C:\\Documents and Settings\\USER\\Mes documents\\Visual Studio 2008\\Projects\\Triplets\\Debug\\triplets.chm"
    [EDIT] : si tu utilises à partir d'une DLL, fais une recherche avec 'AfxSetResourceHandle' sur le forum.

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse. Hélas, cela ne marche pas, j'ai toujours la même erreur. Par contre, j'ai remarqué que dans le log (fichier BuildLog.html), il n'y a aucune trace du fichier que je veux inclure (Triplets.chm). je ne sais pas à quel niveau de détail descend ce log, mais c'est peut-être un indice...

Discussions similaires

  1. Inclure des fichiers dans l'exécutable
    Par theserialkiller10 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 23/12/2009, 00h40
  2. Stoker des fichiers statiques dans son exécutable
    Par diden138 dans le forum Langage
    Réponses: 4
    Dernier message: 10/03/2008, 16h45
  3. Un fichier texte dans mon exécutable
    Par MonPc dans le forum Débuter
    Réponses: 8
    Dernier message: 22/02/2008, 10h09
  4. Réponses: 4
    Dernier message: 20/12/2006, 10h26
  5. fichiers dans le Répertoire d'exécution
    Par bhahmed dans le forum C++Builder
    Réponses: 12
    Dernier message: 15/09/2006, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo