Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Intégrer des fichiers quelconques dans un EXE Panoramic Ven 4 Nov 2016 - 16: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
| |
|