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

C Discussion :

compilation de fichiers externes !


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut compilation de fichiers externes !
    Bonjour,

    Je suis à la base musicien tous trackers -( fasttracker (.xm), impulse tracker (it)) et je me suis mis à la programmation en langage C - bon, j'avais quelques notions de base quand même (j'utilise DEV-C++).

    Mon problême est le suivant:
    afficher une image, jouer du son, c'est facile. Mais lorsque l'on compile l'exécutable, j'appelle les fichiers en externe (*.bmp pour image ou *.xm pour une zik par exemple).
    C'est à dire que j'ai mon *.exe et le fichier *.bmp à côté (dans le même répertoire).
    Or, ce que je voudrais faire, c'est avoir un seul executable *.exe, sans fichier externe [le tout compilé dans un fichier *.exe] -
    Je sais que c'est possible (si! si!) mais je sais pas comment le réaliser techniquement...
    Est-ce que quelqu'un peut m'aider ??

    Merci d'avance.

    Olivier aka Okeanos
    P.S (si vous avez besoin de ziks pour vos prods contactez moi aussi )

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    (Pour Windows)

    Il faut :

    1) - Mettre les fichiers désirés en ressources de l'application.

    2) - Deux cas de figures :

    2-A) Soit la bibliothèque utilisée pour lire (le son ou l'image par exemple) peut utiliser un flux (stream) et on est alors pas obligé de décharger le fichier en ressource sur le disque [l'obtention d'un pointeur sur la ressource sera suffisant).

    2-B) Soit la bibliothèque n'accepte qu'un fichier, et dans ce cas là il faut décharger le fichier en ressource sur le disque.

    ------

    1) Pour mettre le fichier en ressource, voir la doc de l'IDE. On peut le faire manuellement en éditant le fichier de ressource mais c'est plutôt une plaie.

    2) Dans les deux cas de figure, sous Windows, on commence de la même façon.

    Extrait d'un de mes sources C++ (désolé mais il n'y a pas grand chose à modifier pour que ce soit applicable au C). Gestion d'erreur simplifiée pour ne pas nuire à la lisibilité.

    2-A) Dans le cas où l'on veut juste un pointeur sur la ressource, on peut s'arrêter après LockResource().

    2-B) Dans le cas où l'on veut "décharger" la ressource sur disque, la totalité de la fonction peut être nécessaire.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    // Topic : Extract an executable resource to the disk.
    // [IN] [tstring] Path : Path to file where resource data are written.
    // [IN] [DWORD] ResId : ID of the resource.
    // Return [bool] : true on success, false otherwise.
    bool ExtractResource(const tstring& Path, DWORD ResId)
    {
    	// find resource with appropriate ID.
    	HRSRC hMod = ::FindResource(NULL, MAKEINTRESOURCE(ResId), _T("BIN"));
    	if(hMod == NULL)
    		return false;
     
    	// get size of res.
    	DWORD ResSize = ::SizeofResource(NULL, hMod);
    	if(ResSize == 0)
    		return false;
     
    	// Load the res.
    	HGLOBAL hGlob = ::LoadResource(NULL, hMod);
    	if(hGlob == NULL)
    		return false;
     
    	// obtain a pointer on resource data.
    	LPVOID pData = ::LockResource(hGlob);
    	if (pData == NULL)
    		return false;
     
    	// Create a file for writing resource data to disk.
    	HANDLE hFile = ::CreateFile(Path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
    	if(hFile == INVALID_HANDLE_VALUE)
    		return false;
     
    	// Write the data resource to file.
    	DWORD nobw = 0;
    	if(::WriteFile(hFile, pData, ResSize, &nobw, NULL) == FALSE)
    	{
    		CloseHandle(hFile);
    		return false;
    	}
     
    	// release file object.
    	CloseHandle(hFile);
     
    	return true;
    }
    P.S : ceci dit c'est plus une question relative à un O.S qu'au C... Voir forums Linux ou Windows.

Discussions similaires

  1. [MASM] Compiler un fichier .sys ?
    Par - Robby - dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 08/01/2008, 11h28
  2. chargement d'un fichier externe en base de données
    Par samsbike dans le forum Administration
    Réponses: 3
    Dernier message: 24/08/2004, 17h35
  3. Réponses: 1
    Dernier message: 18/06/2004, 01h12
  4. [Système] Ouvrir fichier externe avec prog par défaut de l'OS
    Par Pill_S dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 30/05/2004, 11h54
  5. Réponses: 2
    Dernier message: 25/10/2002, 22h19

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