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++Builder Discussion :

Ajouter Fichiers Ressources en exécution


Sujet :

C++Builder

  1. #1
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut Ajouter Fichiers Ressources en exécution
    Bonjour,
    J'aimerais savoir s'il est possible d'ajouter un fichier dans la ressource de l'éxécutable lorsqu'il est lancé. Je m'explique: mon exécutable contient un fichier texte donnant des informations, l'utilisateur peut extraire ce fichier de l'exécutable pour le modifier.
    Aujourd'hui je teste si le fichier texte existe et si oui, j'utilise celui existant, sinon j'utilise celui en ressource.

    Je veux juste savoir s'il existe une méthode permettant de le recharger dans l'éxécutable pour éviter de laisser trainer le fichier.

    Merci d'avance

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Voir la fonction UpdateResource de l'API win32
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je te remercie de la piste, mais j'ai quand même un petit problème pour mettre à jour ma ressource. Il faut que je mette à jour ma ressource par une autre, ou j'ai mal compris ce qui peut arriver .

    J'effectue le code suivant:
    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
     
    //Update resource
      TMemoryStream *File = new TMemoryStream;
      char *caracteresT;
      AnsiString Chemin_Fichier_Text=ExtractFilePath(Application->ExeName)+"EnglishFrench.lang";
     
    //before update
      TResourceStream *MRes=new TResourceStream((int)HInstance,"UserTransl",RT_RCDATA);
      MRes->SaveToFile("UserTranslationsOriginal.lang");//Sauvegarder le fichier text
      delete MRes;//Libération de la mémoire allouée pour la ressource
     
      if(FileExists(Chemin_Fichier_Text))
      {
         File->LoadFromFile(Chemin_Fichier_Text);
         caracteresT=new char[File->Size];
         File->Read(caracteresT,File->Size);
     
         HANDLE hUpdate = BeginUpdateResource(Application->ExeName.c_str(), FALSE);
         BOOL result = UpdateResource(hUpdate, RT_RCDATA, "UserTransl", MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), File, File->Size);
         if(!result)
         {
            ShowMessage("Update error! Error "+IntToStr(GetLastError()));
         }
         Application->ProcessMessages();
         BOOL result2 = EndUpdateResource(hUpdate, FALSE);
         if(!result2)
         {
            ShowMessage("End update error! Error "+IntToStr(GetLastError()));
         }
     
     
      }
     
    //after update
      TResourceStream *MRes2=new TResourceStream((int)HInstance,"UserTransl",RT_RCDATA);
      MRes2->SaveToFile("UserTranslationsUpdated.lang");//Sauvegarder le fichier text
      delete MRes2;//Libération de la mémoire allouée pour la ressource
      delete File;
    Mon fichier de ressource contient un fichier de type texte appelé "UserTransl" dans mon fichier .rc de type RT_RCDATA. Jusque là tout va bien, je le copie sur le bureau avant sa mise à jour pour voir l'effet.
    L'écriture se passe bien, mais la mise à jour du fichier par EndUpdate me fait une erreur 110 . Du coup, la mise à jour ne s'effectue pas.

    Aurais-je oublier de faire quelque chose, ou est ce que je passe mal mon nouveau fichier en paramètre. Dans un exemple donné par msdn, ils mettent à jour la resource par un autre, cependant dans mon cas l'autre ressource est un fichier du même type que celui à remplacer.

    As-tu une idée CGI, ou quelqun d'autre?

    Merci pour vos aides et commentaires pouvant m'aiguiller sur une piste.

  4. #4
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Nouveau test avec cette fois-ci le code suivant:
    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
     
    DWORD dwFileSize, dwBytesRead;
    LPBYTE lpBuffer;
     
    HANDLE hFile = CreateFile(Chemin_Fichier_Text.c_str(),
                                       GENERIC_READ,
                                       0,
                                       NULL,
                                       OPEN_EXISTING,
                                       FILE_ATTRIBUTE_NORMAL,
                                       NULL);
    if(INVALID_HANDLE_VALUE != hFile)
    {
        dwFileSize = GetFileSize(hFile, NULL);
        lpBuffer = new BYTE[dwFileSize];
        if(ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL) != FALSE)
        {
           HANDLE hResource = BeginUpdateResource(Application->ExeName.c_str(), FALSE);
           if(NULL != hResource)
           {
              if(IS_INTRESOURCE((WORD)"UserTransl") && IS_INTRESOURCE((WORD)RT_RCDATA))
              {
                  if(UpdateResource(hResource,
                                     RT_RCDATA,
                                     MAKEINTRESOURCE((WORD)"UserTransl"),
                                     MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
                                     (LPVOID) lpBuffer,dwFileSize)!= FALSE)
                  {
                      if(EndUpdateResource(hResource, FALSE) != FALSE)
                            ShowMessage("Update succed!");
                  }
               }
           }
        }
        delete [] lpBuffer;
        CloseHandle(hFile);
    }
    Mais pas plus de résultat, le problème vient du EndUpdate qui ne fonctionne pas, parce que surement mal utilisé , pourtant j'ai trouvé plusieurs site utilisant cette manière de procéder, notemment ce lien
    http://="http://www.codeproject.com/...sp?print=true"



    Après d'autres test, mon Update se fait bien SUR MON EXECUTABLE, pas sur mon application lancée par Builder, l'erreur 110 trouvée est un "OPEN_FILE_ERROR", Builder devant se réserver cette resource.

    Cependant, la fonction ne retourne plus d'erreur, mais le fichier n'est pour tant pas mis à jour! Je l'ai sauvé dans le même répertoire pour le vérifier personellement, et le résultat n'est pas là, de plus Update me génère un fichier "RCxx.TMP"

    Si quelqun peut m'éclairer, parce que là, je ne comprend plus.

  5. #5
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Ce fichier est le fichier ressource qui devrait se trouver DANS mon exécutable, mis à jour. Si je l'ouvre, je retrouve les éléments de compilation incompréhensible faisant parti de mon exe et le texte inclu figurant dans mon fichier texte que j'ai moi même mis en resource à la compilation par le fichier rc (merci Interruption13h)
    Mon fichier est effectivement mis à jour, mais le problème est que ma resource ne figure pas dans l'exe, et que l'exe n'en fait rien !

    Ou est mon erreur ?

  6. #6
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    En fait le problème se situerais au niveau des droits d'accès. Je m'explique, j'essaie de mettre à jour un exécutable , lui même ! La ressource est occupé, le logiciel étant en cours, je n'aurais pas les droits d'écriture dans ce module.
    Ce qui explique pourquoi je retrouve ma ressource dans un fichier ".TMP" et non dans l'exe.

    L'idée serai alors de copier l'exe, et de modifier cette copie. la mise à jour se fait alors au démarrage de l'application copié. J'ai trouvé mon explication sur ce site :
    http://66.249.93.104/search?q=cache:...&ct=clnk&cd=37

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/09/2012, 19h25
  2. Réponses: 5
    Dernier message: 05/03/2008, 15h23
  3. [VB6] Problème ajout d'un fichier ressource
    Par jul54 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/02/2007, 14h39
  4. Fichier ressource a l'exécution
    Par poly128 dans le forum Delphi
    Réponses: 34
    Dernier message: 11/02/2007, 16h27
  5. [vb.net][ressources] ajouter des fichiers ressources
    Par graphicsxp dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/02/2006, 13h37

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