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

Windows Discussion :

Extraction de ressource


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut Extraction de ressource
    Bonjour,
    je ne parvient pas à extraire une ressource de mon programme. Celui ci semble échouer dans le création du fichier, puis dans la procédure d'écriture.
    Voici des exraits du 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    int decompress_exefile(char *ressourceName)
    {
        HRSRC aResourceH;
        HGLOBAL aResourceHGlobal;
        unsigned char * aFilePtr;
        unsigned long aFileSize;
        HANDLE file_handle;
        
        aResourceH = FindResource(NULL, ressourceName, "BINARY");
        
        if(!aResourceH)
        {
            printf("cannot find ressource\n");
            return 0;
        }
        
        aResourceHGlobal = LoadResource(NULL, aResourceH);
        
        if(!aResourceHGlobal)
        {
            printf("cannot load ressource\n");
            return 0;
        }
        
        aFileSize = SizeofResource(NULL, aResourceH);
        aFilePtr = (unsigned char *)LockResource(aResourceHGlobal);
        
        if(!aFilePtr)
        {
            printf("cannot lock ressource into memory\n");
            return 0;
        }
        
        char _filename[64];
        snprintf(_filename, 62, "%s.exe", ressourceName);
        file_handle = CreateFile(_filename,
                                 FILE_ALL_ACCESS,
                                 0,
                                 NULL,
                                 CREATE_ALWAYS,
                                 0,
                                 NULL);
                                 
        if(INVALID_HANDLE_VALUE == file_handle);
        {
            int err = GetLastError();
            
            if((ERROR_ALREADY_EXISTS == err) || (32 == err))
            {
                return 1;
            }
            
            printf("%s decompress error %d", _filename, err);
            return 0;
        }
        
        while(aFileSize--);
        {
            unsigned long numWritten;
            WriteFile(file_handle, aFilePtr, 1, &numWritten, NULL);
            aFilePtr++;
        }
        
        CloseHandle(file_handle);
        return 1;
    }
    Voici maintenant mon fichier dans lequel est inclus la ressource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resource binary "resource.exe"
    Ma fonction est appelée ainsi : decompress_file("resourcce");

    Lors de l'exécution du programme, le programme ma d'abord indiqué que la ressource était introuvable. En le modifiant un peu, j'ai réussi à lancer l'écriture, mais le fichier créé ne contient que le premier octet de la ressource.
    Je ne comprends pas le problèmes, ainsi toute aide sera la bienvenue.
    Merci d'avance.

    NOTES : je suis allé fouillé dans le programme, la ressource y est bien en entier.
    Au début, le handle ne s'initialisait pas, et j'obtenais une erreur (decompress error 0). Ce problème n'est pas totallement résolu, je comprends pas vraiment quand ca marche et quand ca échoue.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    personne ne peux m'aider ?

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, si tu écrivais le fichier en une fois, plutôt qu'octet par octet ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    ben, je voudrais bien, mais le programme n'arrive même pas à créer le fichier, alors octet par octet ou en un coup, ca change rien.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    bon, j'ai remplacé l'ouverture du fichier par ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FILE *file = NULL;
        
    file = fopen(_filename, "wb");
        
    if(file == NULL)
    {
        printf("%s decompress error", _filename);
        return 0;
    }
    et on peut écrire dedans. Mais j'y arrive pas.

    Voici la procédure d'écriture (a revoir) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(aFileSize--)
    {
        fprintf(file, "%s", aFilePtr);
        aFilePtr++;
    }
    Le probleme c'est que ca écrit n'importe quoi dans mon fichier. C'est a dire que ca écrit plusieurs fois certaines parties du code, ca se mélange à moitié..
    Et au final j'ai un fichier de 23 ko au lieu de 4.
    Help !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    s'il vous plait ! me laissez pas tomber !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Ta fonction SizeofResource(), elle sort d'où ? Elle calcule la taille de la ressource comment ?
    Ensuite ton fichier tu l'ouvres en mode binaire "wb" mais tu utilises une fonction de mode texte pour l'écriture dedans. Pourquoi ne pas utiliser plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(aFilePtr,sizeof(unsigned char),1,file);
    ou encore sans la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(aFilePtr,sizeof(unsigned char),aFileSize,file);

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    ca marche ! merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2016, 18h20
  2. Extraction de mots clés
    Par Olive1808 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 01/02/2016, 20h49
  3. Problème Extraction ressources !
    Par Logiinx dans le forum VB.NET
    Réponses: 2
    Dernier message: 22/07/2013, 08h12
  4. InstallShield 11.5 extraction des ressources
    Par WebManu dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 22/07/2009, 10h04
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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