Inclure un fichier dans une exécutable avec un fichier.rc
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Inclure un fichier dans une exécutable avec un fichier.rc



  1. #1
    AmigaOS

    Inclure un fichier dans une exécutable avec un fichier.rc


    ------

    Bonjour

    J’ai fait un petit programme en C et j’ai vu qu’on pouvait inclure des fichiers dans le fichier de l’exécutable. J’y ai inclus une icône avec : 1 ICON icone.ico écrit dans un fichier .rc
    Pas de problème.
    Ensuite j’ai voulu rajouter un fichier Bitmap (bmp) avec : 2 RCDATA pal_def.bmp
    Mais là j’ai une erreur : "Syntax error"
    RCDATA n’est t-il pas adapté ?

    Merci

    -----

  2. #2
    AmigaOS

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    J’ai maintenant trouvé un mot clef mieux adapté que RCDATA pour mon fichier à inclure : BITMAP
    Du coup il n’y a plus d’erreur et DevC++ compile.
    Par contre je n’arrive pas à ouvrir le fichier avec fopen :

    Code:
    FILE* pal = NULL ;
    pal = fopen ("pal.bmp", "rb") ;
    if(pal == NULL) printf("erreur") ;
    Dernière modification par AmigaOS ; 16/03/2015 à 22h20.

  3. #3
    Jack
    Modérateur

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    DEVC++? cool. T'es sous windows 95 ou 98?

  4. #4
    bdom001

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    Citation Envoyé par AmigaOS Voir le message
    J’ai maintenant trouvé un mot clef mieux adapté que RCDATA pour mon fichier à inclure : BITMAP
    Du coup il n’y a plus d’erreur et DevC++ compile.
    Par contre je n’arrive pas à ouvrir le fichier avec fopen :
    D'après ce que je vois, c'est normal, la fonction 'fopen' va rechercher les données dans le système de fichier et non dans l'éxecutable lui-même. L'avantage d'utiliser un fichier de ressource (.rc) étant justement d'éviter d'accéder au fichier source en référençant ladite resource via un identifiant généralement défini (#define) dans un fichier "resource.h".

    Je ne connais pas votre environement de dévelopement, mais avec l'API de Win32 (#include <windows.h>) vous pourriez utiliser quelque chose comme :

    Code:
    HBITMAP hBitmap = LoadBitmap(NULL, MAKEINTRESOURCE(ID_BITMAP));
    où ID_BITMAP est justement l'identifiant de la resource en question.
    Dernière modification par bdom001 ; 17/03/2015 à 04h15.

  5. A voir en vidéo sur Futura
  6. #5
    AmigaOS

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    DEVC++? cool. T'es sous windows 95 ou 98?
    Beh Windows 2.1 ^^
    Nom : Windows_2.1.png
Affichages : 114
Taille : 30,8 Ko


    D'après ce que je vois, c'est normal, la fonction 'fopen' va rechercher les données dans le système de fichier et non dans l'éxecutable lui-même. L'avantage d'utiliser un fichier de ressource (.rc) étant justement d'éviter d'accéder au fichier source en référençant ladite resource via un identifiant généralement défini (#define) dans un fichier "resource.h".

    Je ne connais pas votre environement de dévelopement, mais avec l'API de Win32 (#include <windows.h>) vous pourriez utiliser quelque chose comme :

    Code:

    HBITMAP hBitmap = LoadBitmap(NULL, MAKEINTRESOURCE(ID_BITMAP));

    où ID_BITMAP est justement l'identifiant de la resource en question.
    Merci pour la réponse ! J'ai toujours quelques questions:
    Dans "HBITMAP hBitmap = LoadBitmap(NULL, MAKEINTRESOURCE(ID_BITMAP));"
    L'identificateur va remplacer ce que j'avais appelé "PAL" dans mon code ? Je vais par exemple pouvoir écrire :
    Code:
    fscanf(ID_BITMAP, "%c", &B); // ?
    OU
    fscanf(hBitmap, "%c", &B); // ?
    Et ce qu'il y a dans resources.rc, je l'écris donc comme ça ? :
    Code:
    ID_BITMAP BITMAP "pal_def.bmp"
    Dernière modification par AmigaOS ; 17/03/2015 à 19h54.

  7. #6
    Jack
    Modérateur

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    Citation Envoyé par AmigaOS Voir le message
    Beh Windows 2.1 ^^
    Bien joué

  8. #7
    bdom001

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    Pour le fichier .rc, c'est ok!

    Maintenant, vous vous méprenez sur la nature de l'identifiant que j'ai appelé 'ID_BITMAP'.
    C'est un entier (WORD, 16-bit) arbitraire (donc que vous choisissez vous-même et souvent supérieur à 100) compilé en même temps que l'exécutable et dont la seule contrainte est de ne pas induire de redondance avec les identifiants des autres ressources (unicité).

    Cette valeur n'est bien sûr pas fournie au niveau utilisateur (donc pas de 'scanf' ici), mais dans le code, en temps que macro définition :
    Code:
    #define ID_BITMAP xxx
    où xxx est la valeur entière dont je parlais ci-dessus. Cette déclaration/définition doit être faite avant la compilation du fichier .rc, sous peine de quoi la référence 'ID_BITMAP' (arbitraire, elle aussi) restera inconnue et générera une erreur de compilation.
    Ceci est effectué uniquement pour des raisons de commodité. En effet, si par exemple, 300 est une valeur qui convient, vous pourriez très bien écrire dans votre fichier .rc :
    Code:
    300 BITMAP "file.bmp"
    et ensuite réutiliser cette valeur (300) pour votre 'LoadBitmap' :
    Code:
    HBITMAP hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(300));
    Maintenant, si vous regardez au début de votre fichier .rc, vous trouverez peut-être la directive suivante :
    Code:
    #include "resource.h"
    Ce qui veut dire que "resource.h" est un fichier d'en tête propre à votre projet qui contient toutes les macros définitions des identifiants des ressources à compiler. C'est dans ce fichier qu'il vous faut rajouter (toujours avec 300 comme exemple) la définition suivante :
    Code:
    #define ID_BITMAP 300
    Si un fichier ("resource.h") de ce genre n'existe pas dans votre projet, vous pouvez (probablement, moi je suis sous Windows 7, avec Visual Studio 2013) le rajouter.

    P.S. : Erratum, j'ai spécifié dans mon précédent post que le premier paramètre (HINSTANCE) de 'LoadBitmap' devait être NULL. C'est possible, mais uniquement pour référencer des bitmaps préexistantes et internes au système (en tout cas, à partir de Windows 2000) ce qui n'est pas votre cas. Au contraire il faut lui donner la valeur de l'instance de l'application. Cette valeur est fournie par le point d'entrée 'winmain'. C'est-à-dire, uniquement si vous êtes sous Windows, pas en mode 'console DOS'.

    Pour 'LoadBitmap' :
    cf. : https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

    Pour travailler avec des objets bitmap :
    cf. : https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

  9. #8
    bdom001

    Re : Inclure un fichier dans une exécutable avec un fichier.rc

    @AmigaOS, Bonjour, est-ce que vous vous en sortez ?
    Je me suis rappelé que travailler avec les bitmaps avec le GDI (Graphical Device Interface) de Windows n'était pas trivial. Mais je suis parvenu, à titre d'exercice personnel, à en afficher une dans une console DOS. Je ne sais pas ce que vous voulez faire exactement, mais n'hésitez pas à revenir vers moi si vous avez besoin de détails.

    Cordialement.

Discussions similaires

  1. Fichier exécutable en C++ ??
    Par paul2121 dans le forum Programmation et langages, Algorithmique
    Réponses: 13
    Dernier message: 13/10/2014, 20h15
  2. Inclure un fichier .m dans un fichier .mdl
    Par invitebcede47f dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 31/05/2011, 02h25
  3. Écrire un fichier avec un .h, en ouvrant le fichier dans main
    Par AmigaOS dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 30/01/2011, 19h30
  4. probleme fichier executable
    Par invite420bcfcf dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 13/01/2011, 17h53
  5. Inclure un fichier Matlab sous word
    Par invite81c5a5ad dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 05/08/2007, 19h34