FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Panoramic et ses curiosités
par Jean Claude Aujourd'hui à 21:48

» Synedit Parameters
par Jean Claude Aujourd'hui à 21:15

» Utilitaire de suppression de fichiers
par Jean Claude Aujourd'hui à 21:11

» Code à vérifier SVP (Oups ! résolu)
par Jean Claude Hier à 21:16

» Compilateur FBPano
par jean_debord Hier à 9:56

» Bienvenue à Virtualalan !
par UltraVox Hier à 9:18

» Concours de Morpions
par jjn4 Hier à 0:04

» ShortName$(F) [Cloturé]
par papydall Mer 21 Juin 2017 - 16:19

» Remplacer espace par tiret dans noms des dossiers / fichiers
par papydall Mer 21 Juin 2017 - 15:27

» Menu personalisé avec icones et menu contextuel
par Laurent (Minibug) Mer 21 Juin 2017 - 12:44

» La liste des choses à faire ...
par Jack Mar 20 Juin 2017 - 22:49

» Quoi de neuf à propos de Goric 3D ? (@Jack)
par UltraVox Mar 20 Juin 2017 - 21:06

» Nom court et anti fenetre dos
par silverman Mar 20 Juin 2017 - 18:31

» Ludothèque Panoramic
par jjn4 Mar 20 Juin 2017 - 18:09

» Proposition à la communauté
par Yannick Mar 20 Juin 2017 - 15:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2017
LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
2627282930  
CalendrierCalendrier

Partagez | 
 

 Intégrer des fichiers quelconques dans un EXE Panoramic

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Intégrer des fichiers quelconques dans un EXE Panoramic   Ven 4 Nov 2016 - 18:44

Un fichier EXE généré par Panoramic_Editor est essentiellement composé de deux parties:
- l'interpréteur Panoramic
- le source Panoramic encodé
Le source encodé est introduit dans un EXE Windows selon une technique simple et efficace.

Mais cette technique peut être étendue à d'autres fichiers. Pourquoi ne pas importer des fichiers quelconques, comme du texte, des images, d'autres EXE - bref, n'importe quoi ? Après tout, ce ne sont que de simples suites binaires de caractères qui peuvent être importées de la même manière.

Mais alors, comment retrouver les noms des fichiers importés ? Ces noms ne sont pas présents dans les fichiers qu'on veut introduire dans l'EXE ! La réponse, là encore, est très simple: on considère la chaîne de caractères qui contient le nom (et éventuellement le chemin complet) comme un fichier texte et on l'importe de la même manière !

Alors, on peut obtenir une structure du type suivant:
Citation :
[interpréteur de Panoramic]
<données du premier fichier importé>
<nom et chemin du premier fichier importé>
...
<données du dernier fichier importé>
<nom et chemin du dernier fichier importé>
<code Panoramic encodé>
[marqueur de fin de programme Panoramic]

En réalité, c'est un peu plus complexe. Car toutes ces sections sont de longueur parfaitement variable et libre, et il faut donc, devant chaque section, donner sa longueur en octets, ce qui se fait sous forme d'un entier de 32 bits (4 octets). Et un dernier détail! chaque section concernant un fichier importé: on le fait précéder d'un marqueur spécial de 32 bits (4 octets) dont la valeur a peu de chances de se trouver en fin de fichier. J'ai choisi la chaîne de caractères "#KGF".

Tout ceci donne une structure détaillée comme ceci:
Citation :
[interpréteur de Panoramic]
<données du premier fichier importé>
{longueur des données du premier fichier importé}
<nom et chemin du premier fichier importé>
{longueur du nom du premier fichier importé}
[#KGF]
...
<données du dernier fichier importé>
{longueur des données du dernier fichier importé}
<nom et chemin du dernier fichier importé>
{longueur du nom du premier fichier importé}
[#KGF]
<code Panoramic encodé>
{longueur du code Panoramic encodé}
[marqueur de fin de programme Panoramic]

Tout cela peut être géré entièrement en Panoramic. J'ai fait un petit outil qui gère les fonctiions suivantes:
- importattion d'un fichier
- suppression d'un fichier importé
- exportation d'un fichier importé
- liste des fichiers importés
Le programme est géré par un menu très simple, il y a déjà de multiples contrôles de cohérence et il y a une fenêtre flottante avec un mode d'emploi. Une dernière remarque: les fonctions d'importation et de suppression, modifiant l'exécutable, nécessitent l'indication d'un fichier EXE en sortie différent afin d"éviter toute perte d'information. Ceci est contrôlé par le programme.

Prochainement, il y aura des fonctions dans KGF.dll effectuant les mêmes opérations. Voici le code de l'utilitaire:
Code:
' test_ImportFiles.bas

' Un exécutable Panoramic est construit de la manière suivante:
'  [interpréteur Panoramic]
'  [N octets code source Panoramic encodé]
'  (N sur 32 bits)
'  (constante $33 $42 $2E $46 ou $462E4233)
'
' Alors, on insère, juste après l'interpréteur, la séquence suivante:
'  [fichier quelconque sur M octets]
'  (M en 32 bits)
'  (nom du fichier sur F bits)
'  (F en 32 bits)
'  (constante $23 $4B $47 $46 ou $46474B23 = "#KGF")
'
' La constante #KGF sert de marqueur de présence d'un fichier inclus.
'  L'opération peut être répétée à volonté.
'  Si #KGF est trouvé, on sait que le mot juste avant est la longueur
'  du nom de fichier. On peut alors lire ce nom.
'  Le mot qui soit est la longueur du fichier proprement-dit.
'  On peut alors l'extraire.
'
' Les fonctions suivantes gèrent cette structure:
'  ListImportFiles - retourne le nombre et la liste des noms des fichiers importés
'  ExportImportFile - exporte un fichier importé, par son nom ou son indice, ou tous
'  RemoveImportFile - supprime un fichier importé, par son nom ou son indice, ou tous
'  ImportImportFile - importe un nouveau fichier importé

labels()
constantes()
variables()
invisibles()
GUI()
end

importer:
  importer()
  return

supprimer:
  supprimer()
  return

exporter:
  exporter()
  return

lister:
  lister()
  return

sortir:
  terminate
 
 
 
 
chercherexe1imp:
  chercherexe1(no_imp_exe1%)
  return
 
chercherexe1exp:
  chercherexe1(no_exp_exe1%)
  return

chercherexe1list:
  chercherexe1(no_list_exe1%)
  return

chercherexe1supp:
  chercherexe1(no_supp_exe1%)
  return

chercherexe2imp:
  chercherexe2(no_imp_exe2%)
  return

chercherexe2supp:
  chercherexe2(no_supp_exe2%)
  return

chercherfic:
  chercherfic()
  return

impvalider:
  impvalider()
  return

listvalider:
  listvalider()
  return

exportvalider:
  exportvalider()
  return
 
exporteffectuer:
  exporteffectuer()
  return
 
suppvalider:
  suppvalider()
  return
 
suppeffectuer:
  suppeffectuer()
  return

aide:
  aide()
  return
 
apropos:
  apropos()
  return
 
 
sub labels()
  label importer, supprimer, exporter, lister, sortir
  label chercherexe1imp, chercherexe1exp, chercherexe1list, chercherexe1supp
  label chercherexe2imp, chercherexe2supp, chercherfic, impvalider
  label listvalider, exportvalider, exporteffectuer
  label suppvalider, suppeffectuer
  label aide, apropos
end_sub

sub constantes()
  dim vers$              : vers$              = "V01.00"
  dim creation$          : creation$          = "04/11/2016"
  dim no_form_importer%  : no_form_importer%  = 100
  dim no_form_supprimer% : no_form_supprimer% = 200
  dim no_form_exporter%  : no_form_exporter%  = 300
  dim no_form_lister%    : no_form_lister%    = 400
  dim no_form_aide%      : no_form_aide%      = 500
  dim no_form_apropos%  : no_form_apropos%  = 600
  dim no_dlist_noms%    : no_dlist_noms%    = 33
  dim no_dlist_adresses% : no_dlist_adresses% = 34
  dim no_dlist_tailles%  : no_dlist_tailles%  = 35
  dim no_dlist_entetes%  : no_dlist_entetes%  = 36
end_sub

sub variables()
  ' objets
  dim no_container_actif%
  dim no_imp_exe1%, no_imp_exe2%, no_imp_trunc%, no_imp_fic%, no_imp_wait%
  dim no_exp_memo%
  dim no_list_memo%, no_exp_btn%
  dim no_list_exe1%, no_exp_exe1%
  dim no_supp_memo%, no_supp_exe1%, no_supp_exe2%, no_supp_btn%, no_supp_wait%
  ' fichiers
  dim exe2$            : ' nom du fichier EXE en sortie
  dim fic$            : ' nom du fichier à importer
  dim exe1_siz%        : ' taille du fichier en entrée
  dim exe1_adr%        : ' adresse d'insertion potentielle
  dim exe1$            : ' nom du fichier EXE en entrée

end_sub

sub invisibles()
  open_dialog 31
  save_dialog 32
  dlist no_dlist_noms%      : ' liste interne des noms des fichiers
  dlist no_dlist_adresses%  : ' liste interne des adresses de début des fichiers
  dlist no_dlist_tailles%  : ' liste interne des longueurs des fichiers
  dlist no_dlist_entetes%  : ' 4+(longueur du nom du fichier)+4+4
end_sub

sub GUI()
  caption 0,"Gestion des fichiers importés"
  width 0,800 : height 0,650
  main_menu 1
    sub_menu 2  : parent 2,1 : caption 2,"Fichiers"
      sub_menu 3 : parent 3,2 : caption 3,"Importer"    : on_click 3,importer
      sub_menu 4 : parent 4,2 : caption 4,"Supprimer"  : on_click 4,supprimer
      sub_menu 5 : parent 5,2 : caption 5,"Exporter"    : on_click 5,exporter
      sub_menu 6 : parent 6,2 : caption 6,"-"
      sub_menu 7 : parent 7,2 : caption 7,"Lister"      : on_click 7,lister
      sub_menu 8 : parent 8,2 : caption 8,"-"
      sub_menu 9 : parent 9,2 : caption 9,"Sortir"      : on_click 9,sortir
    sub_menu 22 : parent 22,1 : caption 22,"Aide"
      sub_menu 23 : parent 23,22 : caption 23,"Aide"    : on_click 23,aide
      sub_menu 24 : parent 24,22 : caption 24,"Apropos" : on_click 24,apropos
end_sub




sub importer()
  dim_local no%
  if no_container_actif%>0 then hide no_container_actif%
  if object_exists(no_form_importer%)=0
    container no_form_importer% : hide no_form_importer%
      full_space no_form_importer% : caption no_form_importer%,"Importer un fichier"
    no% = no_form_importer%
    ' fichier EXE en entrée
    no% = no% + 1 : alpha no% : parent no%,no_form_importer% : top no%,20 : left no%,20
      caption no%,"Ficher EXE en entrée:"
    no% = no% + 1 : no_imp_exe1% = no% : edit no% : parent no%,no_form_importer%
      top no%,20 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_importer%
      top no%,20 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherexe1imp
    ' fichier EXE en sortie
    no% = no% + 1 : alpha no% : parent no%,no_form_importer% : top no%,50 : left no%,20
      caption no%,"Ficher EXE en sortie:"
    no% = no% + 1 : no_imp_exe2% = no% : edit no% : parent no%,no_form_importer%
      top no%,50 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_importer%
      top no%,50 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherexe2imp
    ' fichier quelconque à importer
    no% = no% + 1 : alpha no% : parent no%,no_form_importer% : top no%,130 : left no%,20
      caption no%,"Ficher à importer:"
    no% = no% + 1 : no_imp_fic% = no% : edit no% : parent no%,no_form_importer%
      top no%,130 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_importer%
      top no%,130 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherfic
    ' flag "préserver le chemin complet"
    no% = no% + 1 : no_imp_trunc% = no% : check no% : parent no%,no_form_importer%
      top no%,160 : left no%,140 : width no%,200 : caption no%,"Préserver le chemin complet"
    ' validation
    no% = no% + 1 : button no% : parent no%,no_form_importer% : top no%,200 : left no%,140
      caption no%,"Valider" : font_bold no% : font_size no%,16 : width no%,200
      on_click no%,impvalider
    ' message d'attente
    no% = no% + 1 : alpha no% : parent no%,no_form_importer% : no_imp_wait% = no%
      hide no% : top no%,250 : left no%,140
      font_size no%,16 : font_bold no% : font_color no%,255,0,0
      caption no%,"Importation en cours..."
  end_if
  exe1$ = ""
  exe2$ = ""
  fic$ = ""
  text no_imp_exe1%,""
  text no_imp_exe2%,""
  text no_imp_fic%,""
  no_container_actif% = no_form_importer%
  show no_container_actif%
end_sub

sub supprimer()
  dim_local no%
  if no_container_actif%>0 then hide no_container_actif%
  if object_exists(no_form_supprimer%)=0
    container no_form_supprimer% : hide no_form_supprimer%
      full_space no_form_supprimer% : caption no_form_supprimer%,"Supprimer un fichier"

    no% = no_form_supprimer%
    ' fichier EXE en entrée
    no% = no% + 1 : alpha no% : parent no%,no_form_supprimer% : top no%,20 : left no%,20
      caption no%,"Ficher EXE en entrée:"
    no% = no% + 1 : no_supp_exe1% = no% : edit no% : parent no%,no_form_supprimer%
      top no%,20 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_supprimer%
      top no%,20 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherexe1supp
    ' fichier EXE en sortie
    no% = no% + 1 : alpha no% : parent no%,no_form_supprimer% : top no%,50 : left no%,20
      caption no%,"Ficher EXE en sortie:"
    no% = no% + 1 : no_supp_exe2% = no% : edit no% : parent no%,no_form_supprimer%
      top no%,50 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_supprimer%
      top no%,50 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherexe2supp
    ' validation
    no% = no% + 1 : button no% : parent no%,no_form_supprimer% : top no%,90 : left no%,140
      caption no%,"Valider" : font_bold no% : font_size no%,16 : width no%,200
      on_click no%,suppvalider
    ' résultats
    no% = no% + 1 : list no% : parent no%,no_form_supprimer% : top no%,120 : left no%,140
      width no%,600 : height no%,400 : no_supp_memo% = no%
    no% = no% + 1 : button no% : parent no%,no_form_supprimer% : no_supp_btn% = no%
      top no%,530 : left no%,140 : caption no%,"Supprimer"
      on_click no%,suppeffectuer
    ' message d'attente
    no% = no% + 1 : alpha no% : parent no%,no_form_supprimer% : no_supp_wait% = no%
      hide no% : top no%,560 : left no%,140
      font_size no%,16 : font_bold no% : font_color no%,255,0,0
      caption no%,"Suppression en cours..."

  end_if
  hide no_supp_memo%
  hide no_supp_btn%
  exe1$ = ""
  text no_supp_exe1%,""
  no_container_actif% = no_form_supprimer%
  show no_container_actif%
end_sub

sub exporter()
  dim_local no%
  if no_container_actif%>0 then hide no_container_actif%
  if object_exists(no_form_exporter%)=0
    container no_form_exporter% : hide no_form_exporter%
      full_space no_form_exporter% : caption no_form_exporter%,"Exporter un fichier"

    no% = no_form_exporter%
    ' fichier EXE en entrée
    no% = no% + 1 : alpha no% : parent no%,no_form_exporter% : top no%,20 : left no%,20
      caption no%,"Ficher EXE en entrée:"
    no% = no% + 1 : no_exp_exe1% = no% : edit no% : parent no%,no_form_exporter%
      top no%,20 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_exporter%
      top no%,20 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherexe1exp
    ' validation
    no% = no% + 1 : button no% : parent no%,no_form_exporter% : top no%,70 : left no%,140
      caption no%,"Valider" : font_bold no% : font_size no%,16 : width no%,200
      on_click no%,exportvalider
    ' résultats
    no% = no% + 1 : list no% : parent no%,no_form_exporter% : top no%,120 : left no%,140
      width no%,600 : height no%,400 : no_exp_memo% = no%
    no% = no% + 1 : button no% : parent no%,no_form_exporter% : no_exp_btn% = no%
      top no%,530 : left no%,140 : caption no%,"Exporter"
      on_click no%,exporteffectuer

  end_if
  hide no_exp_memo%
  hide no_exp_btn%
  exe1$ = ""
  text no_exp_exe1%,""
  no_container_actif% = no_form_exporter%
  show no_container_actif%
end_sub

sub lister()
  dim_local no%
  if no_container_actif%>0 then hide no_container_actif%
  if object_exists(no_form_lister%)=0
    container no_form_lister% : hide no_form_lister%
      full_space no_form_lister% : caption no_form_lister%,"Lister les fichiers"
    no% = no_form_lister%
    ' fichier EXE en entrée
    no% = no% + 1 : alpha no% : parent no%,no_form_lister% : top no%,20 : left no%,20
      caption no%,"Ficher EXE en entrée:"
    no% = no% + 1 : no_list_exe1% = no% : edit no% : parent no%,no_form_lister%
      top no%,20 : left no%,140 : width no%,400
    no% = no% + 1 :button no% : parent no%,no_form_lister%
      top no%,20 : left no%,550 : width no%,30 : caption no%,"..." : font_bold no%
      on_click no%,chercherexe1list
    ' validation
    no% = no% + 1 : button no% : parent no%,no_form_lister% : top no%,70 : left no%,140
      caption no%,"Valider" : font_bold no% : font_size no%,16 : width no%,200
      on_click no%,listvalider
    ' résultats
'    no% = no% + 1 : memo no% : parent no%,no_form_lister% : top no%,120 : left no%,140
'      width no%,600 : height no%,400 : bar_both no% : no_list_memo% = no%
    no% = no% + 1 : list no% : parent no%,no_form_lister% : top no%,120 : left no%,140
      width no%,600 : height no%,400 : no_list_memo% = no%
  end_if
  hide no_list_memo%
  exe1$ = ""
  text no_list_exe1%,""
  no_container_actif% = no_form_lister%
  show no_container_actif%
end_sub

sub chercherexe1(no_exe1%)
  dim_local f$,c1%, c2%, c3%, c4%, fs%, n%
  filter 31,"Fichiers EXE|*.exe"
  f$ = file_name$(31)
  if f$="_" then exit_sub
  if file_exists(f$)=0
    message "Fichier inexistant"
    exit_sub
  end_if
  if exe1$<>""
'    filebin_close 1    ??????????????
    exe1$ = ""
    text no_exe1%,""
  end_if
  ' tester si le fichier EXE Panoramic est valide
  filebin_open_read 1,f$
  fs% = filebin_size(1)
  filebin_position 1,fs%-4
  c1% = filebin_read(1)
  c2% = filebin_read(1)
  c3% = filebin_read(1)
  c4% = filebin_read(1)
  if (c1%<>51) or (c2%<>66) or (c3%<>46) or (c4%<>70)
    filebin_close 1
    message "Pas en fichier EXE Panoramic valide"
    exit_sub
  end_if
  exe1$ = f$
  text no_exe1%,f$
  ' calculer le point d'insertion potentiel
  filebin_position 1,fs%-8
  c1% = filebin_read(1)
  c2% = filebin_read(1)
  c3% = filebin_read(1)
  c4% = filebin_read(1)
  n% = ((c4%*256+c3%)*256+c2%)*256+c1%
'  message hex$(c1%)+"  "+hex$(c2%)+"  "+hex$(c3%)+"  "+hex$(c4%)+" -> "+hex$(n%)
  exe1_adr% = fs% - n% - 8
  exe1_siz% = fs%
  filebin_close 1
'  message "exe1_siz%="+str$(exe1_siz%)+"  exe1_adr%="+str$(exe1_adr%)
end_sub

sub chercherexe2(no_exe2%)
  dim_local f$
  filter 32,"Fichiers EXE|*.exe"
  f$ = file_name$(32)
  if f$="_" then exit_sub
  if file_exists(f$)=1
    if message_confirmation_yes_no("Fichier existe déjà ! Remplacer ?")<>1 then exit_sub
  end_if
  if f$=exe1$
    message "Impossible d'écrire sur le fichier en entrée"
    exit_sub
  end_if
  exe2$ = f$
  text no_exe2%,f$
end_sub

sub chercherfic()
  dim_local f$
  filter 31,"Tous fichiers (*.*)|*.*"
  f$ = file_name$(31)
  if f$="_" then exit_sub
  if file_exists(f$)=0
    message "Fichier inexistant"
    exit_sub
  end_if
  if f$=exe1$
    message "Impossible d'include le fichier d'entrée dans lui-même"
    exit_sub
  end_if
  if f$=exe2$
    message "Impossible d'inclure de fichier de sortie dans lui-même"
    exit_sub
  end_if
  fic$ = f$
  text no_imp_fic%,f$
end_sub

sub impvalider()
  dim_local sz_nom_fic%, sz_data_fic%, i%, n%, f$
  ' contrôles de cohérence
  if exe1$=""
    message "Le fichier en entrée manque"
    exit_sub
  end_if
  if exe2$=""
    message "Le fichier en sortie manque"
    exit_sub
  end_if
  if fic$=""
    message "Le fichier à importer manque"
    exit_sub
  end_if
  if exe1$=exe2$
    message "Les fichiers en entrée et sortie ne peuvent pas être identiques"
    exit_sub
  end_if
  if exe1$=fic$
    message "Le fichier en entrée ne peut pas être importé"
    exit_sub
  end_if
  if exe2$=fic$
    message "Le fichier en sortie ne peut pas être importé"
    exit_sub
  end_if
  ListeDesFichiers()
  if count(no_dlist_noms%)>0
    for i%=1 to count(no_dlist_noms%)
      if item_read$(no_dlist_noms%,i%)=fic$
        message "Le fichier est déjà présent"
        exit_sub
      end_if
    next i%
  end_if
 
  ' début de la génération
  show no_imp_wait%
  display
  if file_exists(exe2$)=1 then file_delete exe2$
  sz_nom_fic% = len(fic$)
  filebin_open_read 2,fic$
  sz_data_fic% = filebin_size(2)
  filebin_open_read 1,exe1$
  filebin_open_write 3,exe2$
  ' copier l'interpréteur de Panoramic
  dim_local buf%(exe1_adr%)
  filebin_block_read 1,exe1_adr%,buf%(0)
  filebin_block_write 3,exe1_adr%,buf%(0)
  ' copier les données du fichier à importer
  free buf%
  dim_local buf%(sz_data_fic%)
  filebin_block_read 2,sz_data_fic%,buf%(0)
  filebin_block_write 3,sz_data_fic%,buf%(0)
  ' copier la longueur des données
  n% = sz_data_fic%
  free buf%
  dim_local buf%(4)
  buf%(0) = bin_and(n%,255)
  buf%(1) = bin_and((n%/256),255)
  buf%(2) = bin_and((n%/(256*256)),255)
  buf%(3) = bin_and((n%/(256*256*256)),255)
  filebin_block_write 3,4,buf%(0)
  ' copier le nom du fichier
  if checked(no_imp_trunc%)=0 then f$ = file_extract_name$(exe1$)  : ' nom SANS le chemin par défaut !
  n% = len(f$)
  free buf%
  dim_local buf%(n%)
  for i%=1 to n%
    buf%(i%-1) = asc(mid$(f$,i%,1))
  next i%
  filebin_block_write 3,n%,buf%(0)
  ' copier la longueur du nom du fichier
  free buf%
  dim_local buf%(4)
  buf%(0) = bin_and(n%,255)
  buf%(1) = bin_and((n%/256),255)
  buf%(2) = bin_and((n%/(256*256)),255)
  buf%(3) = bin_and((n%/(256*256*256)),255)
  filebin_block_write 3,4,buf%(0)
  ' copier le marqueur "#KGF"
  buf%(0) = asc("#")
  buf%(1) = asc("K")
  buf%(2) = asc("G")
  buf%(3) = asc("F")
  filebin_block_write 3,4,buf%(0)
  ' copier le reste du fichier en entrée (code Panoramic et 2 mots de terminaison)
  free buf%
  dim_local buf%(exe1_siz%-exe1_adr%)
  filebin_position 1,exe1_adr%    : ' sinon, il y a un problème (non identifié...)
  filebin_block_read 1,exe1_siz%-exe1_adr%,buf%(0)
  filebin_block_write 3,exe1_siz%-exe1_adr%,buf%(0)
  ' fermer les fichiers
  filebin_close 1
  filebin_close 2
  filebin_close 3
  hide no_imp_wait%
  display
  message "Import terminé"
end_sub

sub ListeDesFichiers()
  dim_local a%, s$, n%, i%
  filebin_open_read 1,exe1$
  a% = exe1_adr% - 4
  filebin_position 1,a%
  ' tester s'il y a 'identificateur "#KGF"
  dim_local buf%(4)
  filebin_block_read 1,4,buf%(0)
  s$ = chr$(buf%(0)) + chr$(buf%(1)) + chr$(buf%(2)) + chr$(buf%(3))
  while s$="#KGF"
    ' #KGF trouvé ? alors lister le fichier
    a% = a% - 4    : ' revenir devant le #KGF et devant la longueur du nom de fichier
    ' lire et convertir la longueur du nom de fichier
    filebin_position 1,a%
    filebin_block_read 1,4,buf%(0)
    n% = ((buf%(3)*256+buf%(2))*256+buf%(1))*256+buf%(0)
    item_add no_dlist_entetes%,str$(4+n%+4+4)
    free buf%
    dim_local buf%(n%)
    a% = a% - n%      : ' pointer au début du nom de fichier
    filebin_position 1,a%
    ' lire e convertir le nom de fichier
    filebin_block_read 1,n%,buf%(0)
    s$ = ""
    for i%=1 to n%
      s$ = s$ + chr$(buf%(i%-1))
    next i%
    item_add no_dlist_noms%,s$    : ' mémoriser le nom dans la liste interne
    a% = a% - 4      : ' revenir devant le nom de fichier et pointer sur la longueur des données
    free buf%
    dim_local buf%(4)
    filebin_position 1,a%
    ' lire et convertir la longueur des données
    filebin_block_read 1,4,buf%(0)
    n% = ((buf%(3)*256+buf%(2))*256+buf%(1))*256+buf%(0)
    item_add no_dlist_tailles%,str$(n%)  : ' mémoriser la taille dans la liste interne
    a% = a% - n% : ' pointer au début des données du fichier
    item_add no_dlist_adresses%,str$(a%)  : ' mémoriser l'adresse des données dans la liste interne
    ' ...
    a% = a% - 4  : ' pointer sur l'éventuel marqueur #KGF
    filebin_position 1,a%
    ' tester s'il y a 'identificateur "#KGF"
    free buf%
    dim_local buf%(4)
    filebin_block_read 1,4,buf%(0)
    s$ = chr$(buf%(0)) + chr$(buf%(1)) + chr$(buf%(2)) + chr$(buf%(3))
  end_while
  filebin_close 1
end_sub

sub listvalider()
  dim_local a%, s$, n%, i%
  ' contrôles de cohérence
  if exe1$=""
    message "Le fichier en entrée manque"
    exit_sub
  end_if
  ' analyse des importations
  clear no_list_memo%
  clear no_dlist_noms% : clear no_dlist_adresses% : clear no_dlist_tailles% : clear no_dlist_entetes%

  ListeDesFichiers()
  if count(no_dlist_noms%)>0
    for i%=1 to count(no_dlist_noms%)
      item_add no_list_memo%,item_read$(no_dlist_noms%,i%)
    next i%
  end_if
  item_add no_list_memo%,""
  item_add no_list_memo%,"  Nombre de fichiers importés: "+str$(count(no_dlist_noms%))
 
  show no_list_memo%
end_sub

sub exportvalider()
  dim_local a%, s$, n%, i%
  ' contrôles de cohérence
  if exe1$=""
    message "Le fichier en entrée manque"
    exit_sub
  end_if
  ' analyse des importations
  clear no_exp_memo%
  clear no_dlist_noms% : clear no_dlist_adresses% : clear no_dlist_tailles% : clear no_dlist_entetes%

  ListeDesFichiers()
  if count(no_dlist_noms%)>0
    for i%=1 to count(no_dlist_noms%)
      item_add no_exp_memo%,item_read$(no_dlist_noms%,i%)
    next i%
  end_if
  item_add no_exp_memo%,""
  item_add no_exp_memo%,"  Nombre de fichiers importés: "+str$(count(no_dlist_noms%))

  show no_exp_memo%
  show no_exp_btn%
end_sub

sub exporteffectuer()
  dim_local f$, n%, l%, a%
  ' contrôles de cohérence
  if exe1$=""
    message "Le fichier en entrée manque"
    exit_sub
  end_if
  if count(no_dlist_noms%)=0
    message "Il n'y a aucun fichier à exporter"
    exit_sub
  end_if
  if item_index(no_exp_memo%)=0
    message "Aucun fichier n'est sélectionné"
    exit_sub
  end_if
  if item_index(no_exp_memo%)>count(no_dlist_noms%)
    message "Aucun fichier n'est sélectionné"
    exit_sub
  end_if
  n% = item_index(no_exp_memo%)
  f$ = item_read$(no_dlist_noms%,n%)
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then exit_sub
    file_delete f$
  end_if
  ' export du fichier
  filebin_open_read 1,exe1$
  filebin_open_write 2,f$
  ' pointer sur le début des données du fichier
  a% = val(item_read$(no_dlist_adresses%,n%))
  filebin_position 1,a%
  l% = val(item_read$(no_dlist_tailles%,n%))
  ' copier les données
  dim_local buf%(l%)
  filebin_block_read 1,l%,buf%(0)
  filebin_block_write 2,l%,buf%(0)
  free buf%
  filebin_close 1
  filebin_close 2
  message "Export terminé"
end_sub

sub suppvalider()
  dim_local a%, s$, n%, i%
  ' contrôles de cohérence
  if exe1$=""
    message "Le fichier en entrée manque"
    exit_sub
  end_if
  if exe2$=""
    message "Le fichier en sortie manque"
    exit_sub
  end_if
  if exe1$=exe2$
    message "Les fichiers en entrée et sortie ne peuvent pas être identiques"
    exit_sub
  end_if
  ' analyse des importations
  clear no_supp_memo%
  clear no_dlist_noms% : clear no_dlist_adresses% : clear no_dlist_tailles% : clear no_dlist_entetes%

  ListeDesFichiers()
  if count(no_dlist_noms%)>0
    for i%=1 to count(no_dlist_noms%)
      item_add no_supp_memo%,item_read$(no_dlist_noms%,i%)
    next i%
  end_if
  item_add no_supp_memo%,""
  item_add no_supp_memo%,"  Nombre de fichiers importés: "+str$(count(no_dlist_noms%))

  show no_supp_memo%
  show no_supp_btn%

end_sub

sub suppeffectuer()
  dim_local f$, n%, l%, a%
  ' contrôles de cohérence
  if exe1$=""
    message "Le fichier en entrée manque"
    exit_sub
  end_if
  if exe2$=""
    message "Le fichier en sortie manque"
    exit_sub
  end_if
  if exe1$=exe2$
    message "Les fichiers en entrée et sortie ne peuvent pas être identiques"
    exit_sub
  end_if
  if count(no_dlist_noms%)=0
    message "Il n'y a aucun fichier à supprimer"
    exit_sub
  end_if
  if item_index(no_supp_memo%)=0
    message "Aucun fichier n'est sélectionné"
    exit_sub
  end_if
  if item_index(no_supp_memo%)>count(no_dlist_noms%)
    message "Aucun fichier n'est sélectionné"
    exit_sub
  end_if
  n% = item_index(no_supp_memo%)
  ' début de la suppression
  show no_supp_wait%
  display
  ' suppression du fichier
  filebin_open_read 1,exe1$
  filebin_open_write 2,exe2$
  ' pointer sur le début des données du fichier
  a% = val(item_read$(no_dlist_adresses%,n%))
  ' copier le début du fichier EXE en entrée jusqu'au début du fichier à supprimer
  dim_local buf%(a%)
  filebin_block_read 1,a%,buf%(0)
  filebin_block_write 2,a%,buf%(0)
  ' dépasser le fichier à supprimer
  a% = a% + val(item_read$(no_dlist_tailles%,n%)) + val(item_read$(no_dlist_entetes%,n%))
  filebin_position 1,a%
  ' copier le reste du fichier EXE en entrée
  l% = filebin_size(1) - a%
  free buf%
  dim_local buf%(l%)
  filebin_block_read 1,l%,buf%(0)
  filebin_block_write 2,l%,buf%(0)
  free buf%
  filebin_close 1
  filebin_close 2
  hide no_supp_wait%
  display
  message "Suppression terminée"
end_sub

sub aide()
  dim_local no%
  if object_exists(no_form_aide%)=0
    form no_form_aide% : hide no_form_aide%
      width no_form_aide%,650 : height no_form_aide%,700
      caption no_form_aide%,"A propos"
      top no_form_aide%,(screen_y-height(no_form_aide%))/2
      left no_form_aide%,(screen_x-width(no_form_aide%))/2
      font_size no_form_aide%,10
    no% = no_form_aide%
    no% = no% + 1 : memo no% : parent no%,no_form_aide%
      full_space no% : bar_both no%
      item_add no%,"Gestion des fichiers importés"
      item_add no%,""
      item_add no%,"Cet utilitaire permet d'importer un ou plusieurs fichiers quelconques dans un programme Panoramic."
      item_add no%,"Mais il peut aussi extraire un de ces fichiers, ou de le supprimer, ainsi que d'en afficher la liste."
      item_add no%,"Le programme travaille sur un fichier EXE créé par Panoramic_Editor, en refusant tout autre fichier."
      item_add no%,"Le fichier en sortie doit être différent du fichier en entrée pour éviter toute perte involonataire."
      item_add no%,"Le ou les fichiers à importer peuvent être de n'importe quel type. Mais il y a deux restrictions:"
      item_add no%,"  1. le fichier à importer ne peut pas être le fichier EXE en entrée"
      item_add no%,"  2. le fichier à importer ne peut pas être le fichier EXE en sortie"
      item_add no%,"Les données et nom des fichiers sont mémorisés, éventuellement avec leur chemin."
      item_add no%,""
      item_add no%,"Importation:"
      item_add no%,"  On choisit le fichier EXE dans lequel on veut importer un fichier."
      item_add no%,"  On choisit ensuite le fichier EXE en sortie."
      item_add no%,"  S'il existe déjà, le programme demande confirmation pour le remplacement."
      item_add no%,"  Enfin, on choisit le fichier à importer, en respectant les restrictions ci-dessus."
      item_add no%,"  Une case à cocher permet de préserver le chemin complet du fichier à importer."
      item_add no%,"  Par défaut, seul le nom du fichier est mémorisé."
      item_add no%,"  Le bouton [Valider] lance alors l'importation. Patience..."
      item_add no%,"  La cohérence des champs saisis est vérifiée avant le début de l'importation."
      item_add no%,""
      item_add no%,"Suppression:"
      item_add no%,"  On choisit le fichier EXE dans lequel on veut supprimer un des fichiers importés."
      item_add no%,"  Le bouton [Valider] affiche alors la liste des fichiers importés."
      item_add no%,"  On peut alors sélectionner un des fichiers."
      item_add no%,"  Après une confirmation, ce fichier importé sera retiré du fichier EXE."
      item_add no%,"  Patience..."
      item_add no%,""
      item_add no%,"Exportation:"
      item_add no%,"  On choisit le fichier EXE duquel on veut exporter un des fichiers importés."
      item_add no%,"  Le bouton [Valider] affiche alors la liste des fichiers importés."
      item_add no%,"  On peut alors sélectionner un des fichiers."
      item_add no%,"  Le bouton [Exporter] exporte alors ce fichier, soit dans le dossier par défaut"
      item_add no%,"  soit dans le dossier dont le chemin a été mémorisé."
      item_add no%,""
      item_add no%,"Liste des fichiers:"
      item_add no%,"  On choisit le fichier EXE dont on veut faire la liste des fichiers importés."
      item_add no%,"  Le bouton [Valider] affiche alors la liste des fichiers importés."
  end_if
  show no_form_aide%
  to_foreground no_form_aide%
end_sub

sub apropos()
  dim_local no%
  if object_exists(no_form_apropos%)=0
    form no_form_apropos% : hide no_form_apropos%
      caption no_form_apropos%,"A propos"
      top no_form_apropos%,(screen_y-height(no_form_apropos%))/2
      left no_form_apropos%,(screen_x-width(no_form_apropos%))/2
    no% = no_form_apropos%
    no% = no% + 1 : alpha no% : parent no%, no_form_apropos%
      top no%,30 : left no%,30 : caption no%,"Version "+vers$
      font_bold no%
    no% = no% + 1 : alpha no% : parent no%, no_form_apropos%
      top no%,70 : left no%,30 : caption no%,"Créé le "+creation$
      font_bold no%
    no% = no% + 1 : alpha no% : parent no%, no_form_apropos%
      top no%,100 : left no%,30 : caption no%,"Par Klaus"
      font_bold no%
  end_if
  show no_form_apropos%
  to_foreground no_form_apropos%
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7824
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Ven 4 Nov 2016 - 19:09

J' avais attaqué il y a quelques jours un créateur de fichier _install.exe
mais j' ai laissé tombé devant le temps que mettait mon programme à créer ce fichier.

J' étais parti de là :

copie du code source de l' install
dans un memo

data "*nom_du_fichier"
data "#destination_du_fichier"
data "code_binaire_du_fichier"

Pour l' exe panoramic, le fichier était celui du source *.bas
recréé en exe par l' install.

Mais si je rajoutai KGF.dll, affraid
J' avais le temps de secher devant mon ordi avant que le fichier install soit créé...
Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 9969
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Intégrer des fichiers quelconques dans un EXE Panoramic   Ven 4 Nov 2016 - 19:48

Ne réinvente pas la ficelle à couper le beurre ! Prends Inno Setup - c'est puissant, souple et rapide. L'installateur de Synedit_Editor est fait avec ça. Et encore... je n'utilise qu'une minuscule fraction des multiples possibilités de ce logiciel. Il peut même gérer les clés de registre pour l'application, si besoin est !

Mon code ci-dessus n'est pas destiné à faire un installateur. Mais plutôt un programme qui emporte ses propres fichiers et peut les restituer en cas de besoin, n'importe où. C'est un peu la fonction "Application" de Panoramic_Editor, mais en ouvrant plus largement les possibilités d'inégration des fichiers, et en les gérant à l'unité au lieu de prendre le conenu de tout un dossier, indifféremment.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Intégrer des fichiers quelconques dans un EXE Panoramic   

Revenir en haut Aller en bas
 
Intégrer des fichiers quelconques dans un EXE Panoramic
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Intégrer une page HTML dans son programme ?
» Intégrer le forum dans un CMS ?
» (#328) impossibilité d'intégrer le code d'insertion des vidéos youtube dans l'éditeur.
» Comment intégrer une radio sur son forum?
» Code pour Intégrer Lecteur Soundcloud

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: