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

Langage Delphi Discussion :

Générer DYNAMIQUEMENT un EXE encapsulant données variables


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut Générer DYNAMIQUEMENT un EXE encapsulant données variables
    Comment générer DYNAMIQUEMENT (et non en tant que résultat d'une compilation)un fichier EXE qui encapsulerait des données choisies par l'utilisateur.

    Je m'explique:

    Je construis un logiciel de réalisation de diaporamas. Ce projet contient deux EXECUTABLES.
    Un premier, le PROGRAMME DE MONTAGE, qui met en place toutes les variables du diaporama, images, sons et paramètres associés (type de transition, durées etc..).
    Le produit issu de ce travail est un deuxième EXE, le 'MOTEUR de projection' qui doit encapsuler toutes ces données pour former un tout cohérent: le DIAPORAMA.

    Avec la FAQ d'Olivier LANCE, j'ai déjà un premier élément de réponse. Dans le programme 1 je suis capable de générer le programme 2, le MOTEUR.
    Je peux certes copier à sa suite toutes les données pour en faire un seul fichier.

    Mais alors deux questions se posent:
    1. est-ce que je peux encore exécuter ce programme 2, le MOTEUR. Les données ajoutées à la fin ne vont-elles pas perturber Windows,
    2. et ensuite, comment faire pour récupérer ces données dans le moteur?

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    A la première question, j'ai une réponse.
    Je viens de faire un essai et apparemment Windows ne se formalise pas outre mesure pour charger et exécuter un EXE qui soit prolongé par des données ne lui appartenant pas.

    Quelqu'un pourrait-il me confirmer la chose? Est-ce une certitude?
    A ce propos quelle est la taille maximale d'un EXE que Windows accepte d'alimenter en mémoire?

    Deuxième question: comment exploiter ces données?

    Je peux certes relire le fichier EXE+DONNEES, bloc par bloc en allant au dela de la fin de l'exécutable (au fait comment je la trouve), mais comme elles sont déjà en mémoire(enfin je le suppose), n'y aurait-il pas un moyen de les récupérer à cet endroit?

    Merci pour vos réponses éclairées.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    IL va falloir que tu te plonge un peu dans le format PE
    Il y a une serie d'articles publies par Olivier Lance recemment ce site ou encore mon site (http://www.lookinginside.net)

    Pour ton logiciel, je ne te conseilel pas d'ajouter des donnees a la volee a la fin de l'executable, en effet, la taille des sections d'un programme (un fichier exe est compose de sections) est definis dans les entetes et si la taille de la section dans l'en-tete et la taille reele ne correspondent pas tu risque d'avoir des problemes.
    La solution est d'ajouter une section a ton programme et de stocker les donnees dans cette nouvelle section dont tu peux regler la taille a ta guise.
    Pour cela, j'avais ecris un article sur mon site.
    Mais j'ai aussi fais un patcher dispo sur http://glayag.free.fr/Delphi qui fait exactement ce que tu veux (creation d'une section dans un prog, ajout des donnees dans la section, lecture de la nouvelle section par le prog cible).

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Merci pour tes réponses Yarocco. Je vais étudier de près ces informations disponibles sur ces sites.
    Effectivement ajouter des données tierces à un EXE ne me paraissait pas un processus très orthodoxe. J'ai travaillé autrefois sur ce qu'on appelait des 'loader' qui n'auraient pas accepté la chose.

    (edit)
    je viens de regarder en vitesse le tutoriel de Olivier Lance sur le format PE. Cela s'appelle toujours un loader!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Ben oui, c'est le loader de Windows, enfin le loader des fichiers au format PE de windows.

    En fait, tu peux tres bien ajouter des donnees a la fin du fichier mais il faut voir si les donnees que tu rajoutent ne font pas une section plus grande que ce qu'elle a etee annoncee dans l'en-tete

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Mais si les données sont à la fin, il faut pas s'en inquieter outre mesure :
    Pour obtenir la taille exacte de l'exe, sans autre données :
    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
     
    ...
    uses Windows;
    ...
    function GetExeSize: cardinal;
    var
      p: pchar;
      i, NumSections: integer;
    const
      IMAGE_PE_SIGNATURE  = $00004550;
    begin
      result := 0;
      p := pointer(hinstance);
      inc(p, PImageDosHeader(p)._lfanew + sizeof(Cardinal));
      NumSections := PImageFileHeader(p).NumberOfSections;
      inc(p,sizeof(TImageFileHeader)+ sizeof(TImageOptionalHeader));
      for i := 1 to NumSections do
      begin
        with PImageSectionHeader(p)^ do
          if PointerToRawData+SizeOfRawData > result then
            result := PointerToRawData+SizeOfRawData;
        inc(p, sizeof(TImageSectionHeader));
      end;
    end;
    Après, tu charge le fichier application, tu fait un seek jusqu'à ExeSize et tu lis ce que tu veux, sans aucun format à respecter ( principe du SFX )

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Merci Smiley, je vais essayer cela, et quand j'ai le résultat je passe le post à [résolu].

Discussions similaires

  1. Graphique Dynamiques et source de données variables
    Par spartan_29 dans le forum Excel
    Réponses: 14
    Dernier message: 05/05/2015, 14h14
  2. Création d'un tableau croisé dynamique avec base données variable
    Par div20 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/01/2012, 23h43
  3. [XL-2003] générer plusieurs graphiques doubles axes Y avec base de données variable
    Par didyvine dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/07/2009, 13h44
  4. Réponses: 12
    Dernier message: 22/07/2009, 12h00
  5. [VBA] excel croisé dynamique et plage de données variables
    Par totoche dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/01/2006, 18h14

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