Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Embarquer un fichier quelconque | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Embarquer un fichier quelconque Jeu 23 Avr 2015 - 16:21 | |
| On en a déjà parlé, le problème est de ne pas être obligé de joindre un fichier à un programme Panoramic, pour qu'il soit autonome et transportable. L'idée est d'intégrer le fichier (n'importe quel format) au programme sous forme de datas, et de le reconstituer au moment de l'exécution. Comme ce sont des datas il faut que ce soit sous forme ascii, donc en hexadécimal. Je pensais en particulier à un autre post qui demandait un moyen de connaître les coordonnées de la souris sur la totalité de l'écran, et à une petite dll de Nardo (mouse.dll) qui fait ça très bien. Dans ce cas, la dll fait environ 40k octets, ce qui produit environ 1300 lignes de datas, ce qui est déjà beaucoup. Il y a deux petites subs toutes simples: - Fic2Data(), indépendante du programme cible, qui convertit le fichier en lignes de datas, dans un fichier texte, à 'coller' dans le programme. - Data2Fic(), intégrée au programme cible, qui reconstitue le fichier binaire à partir des datas. - Code:
-
DIM f$,ft$ f$ = "C:\PANORAMIC\NARDO\mouse.dll" ft$ = "Z:\mouse.txt"
File2Data(f$,ft$,40) ' Data2File("mouse.dll","Z:\mouse.dll")
PRINT "Terminé !" END ' ============================================================================== SUB File2Data(f$,fr$,nol%) ' Conversion d'un fichier quelconque en lignes de datas (forme hexa) pour ' intégration dans un programme Panoramic et reconstitution à l'exécution. ' Fichier f$, fichier texte résultat fr$, nol% octets par ligne de datas. DIM_LOCAL sz%,nb%,rs%,i%,a$,q$ q$ = CHR$(34): ' quote IF nol%=0 THEN nol%=32: ' nombre d'octets par ligne de datas FILEBIN_OPEN_READ 1,f$: FILE_OPEN_WRITE 2,fr$ sz% = FILEBIN_SIZE(1): nb% = INT(sz%/nol%): rs% = sz%-nb%*nol% FILE_WRITELN 2,"DATA "+q$+FILE_EXTRACT_NAME$(f$)+q$ FOR i% = 1 TO nb% a$ = FILEBIN_HEXA_READ$(1,ll%): FILE_WRITELN 2,"DATA "+q$+a$+q$ NEXT i% IF rs%>0 THEN a$=FILEBIN_HEXA_READ$(1,rs%): FILE_WRITELN 2,"DATA "+q$+a$+q$ FILE_WRITELN 2,"DATA "+q$+"F"+q$ FILEBIN_CLOSE 1: FILE_CLOSE 2 END_SUB ' ============================================================================== SUB Data2File(f$,fr$) ' Reconstitution d'un fichier f$ intégré sous forme de lignes de datas, création ' du fichier fr$ (chemin complet). DIM_LOCAL a$ RESTORE: READ a$: WHILE UPPER$(a$)<>UPPER$(f$): READ a$: END_WHILE FILEBIN_OPEN_WRITE 9,fr$ READ a$ WHILE a$ <> "F" FILEBIN_HEXA_WRITE 9,LEN(a$)/2,a$: READ a$ END_WHILE FILEBIN_CLOSE 9 END_SUB ' ============================================================================== ' Résultat: DATA "mouse.dll" DATA "4D5A50000200000004000F00FFFF0000B80000000000000040001A0000000000" DATA "0000000000000000000000000000000000000000000000000000000000010000" DATA "BA10000E1FB409CD21B8014CCD219090546869732070726F6772616D206D7573" ... DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "F"
Remarque: les lignes de datas sont encadrées par le nom du fichier et la lettre "F", pour faciliter leur repérage à la lecture. Et je répète que ce n'est valable que pour de petits fichiers: exécutables, images, icônes, etc. (je le déconseille fortement pour KGF.dll, par exemple ) Edit 24/4 correction erreur de nom de variable (merci papydall)
Dernière édition par JL35 le Ven 24 Avr 2015 - 9:48, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Embarquer un fichier quelconque Jeu 23 Avr 2015 - 16:33 | |
| Oui c'est plus simple à parrtager, en effet. Notamment pour tout mettre sur le forum (ce dernier ne devrait pas faire de changement sur ce type de données) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Embarquer un fichier quelconque Jeu 23 Avr 2015 - 16:45 | |
| Il y a quand même des restrictions, pour le forum: il n'accepte pas de listing trop long (plus de 1000 lignes environ), et dans ce cas il faut mettre en plusieurs morceau, ce qui n'est pas trop gênant après tout. Pour ce qui est des datas, en effet le forum ne devrait pas modifier, puisqu'ils sont en hexa. Mais il ne se gêne pas pour le faire quand il y a certaines combinaisons de caractères (par exemple \ suivi de " , où le \ est escamoté, ce qui est inadmissible dans une section 'Code') | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Embarquer un fichier quelconque Jeu 23 Avr 2015 - 17:28 | |
| oui plus les codes d'emote comme ":" suivit de ")" mais comme tu dis, là en hexa, sauf erreur de ma part, cela ne peut pas se produire | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 0:29 | |
| Pour intégrer un fichier dans un exécutable, il y a aussi la solution d'utiliser des "ressources". Ce sont justement des fichiers intégrés dans un exécutable ou dans une DLL, et Windows a les moyens (via un API) de les utiliser, extraire, supprimer etc.
Certes, Panoramic ne donne pas accès à ces fonctions. Mais KGF.dll a les outils nécessaires. On peut ajouter, par un programme Panoramic (si, si !) un ou plusieurs fichiers dans un exécutable sous forme de ressource, et cet exécutable peut ensuite utiliser ou extraire ces ressources et les restituer sous forme de fichiers. C'est un moyen plus "élégant" de transporter des images, sons etc, mais en fait n'importe quoi, y compris d'autres exécutables ou DLLs. On peut même y inclure un programme d'installation qui, une fois extrait et lancé par la commande EXECUTE, va installer, disons une police, un ActiveX, une application, ...
Tout est possible. Certes, pas en Panoramic pur, mais les utilisateurs de KGF.dll n'y verront qu'un inconvénient mineur...
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 0:38 | |
| Hello JL35 ERREUR : Not correct arithmetic expression :.Line 19 - Code:
-
sz% = FILEBIN_SIZE(1) : nb% = INT(sz%/ll%) : rs% = sz%-nb%*ll% En effet ll% n’est déclarée nulle part. What is ll%? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 1:04 | |
| En fait, voici mon utilitaire de gestion de ressources dans un EXE ou une DLL: - Code:
-
' gextion_ressources.bas
label ouvrir, sel3, sel4, click7, click12 label click15, click16, click17, click18, click20
dim res%, f$, s$, t$, n$, r$
full_space 0 caption 0,"Gestion des ressources"
button 1 : top 1,10 : left 1,10 : caption 1,"Ouvrir" on_click 1,ouvrir open_dialog 2 alpha 8 : top 8,10 : left 8,1000 : caption 8,"Toutes les ressources dans fichier EXE/DLL:" list 3 : top 3,30 : left 3,1000 : width 3,250 : height 3,500 on_click 3,sel3 alpha 9 : top 9,10 : left 9,740 : caption 9,"Indexe de type de ressource actuel:" list 4 : top 4,30 : left 4,740 : width 4,250 : height 4,500 on_click 4,sel4 alpha 5 : top 5,70 : left 5,10 : caption 5,"Type de ressource:" edit 6 : top 6,70 : left 6,130 : width 6,150 button 7 : top 7,70 : left 7,290 : width 7,150 caption 7,"Indexe de ce type" : on_click 7,click7
alpha 10 : top 10,100 : left 10,10 : caption 10,"Nom de ressource:" edit 11 : top 11,100 : left 11,130 : width 11,150 button 12 : top 12,100 : left 12,290 : width 12,150 caption 12,"Fichier de la ressource" : on_click 12,click12 edit 13 : top 13,130 : left 13,10 : width 13,700 inactive 13 : font_bold 13 button 15 : top 15,180 : left 15,10 : width 15,150 caption 15,"Ajouter fichier ressource" : on_click 15,click15 button 16 : top 16,180 : left 16,170 : width 16,150 caption 16,"Remplacer fichier ressource" : on_click 16,click16 button 17 : top 17,180 : left 17,330 : width 17,150 caption 17,"Supprimer fichier ressource" : on_click 17,click17 button 18 : top 18,180 : left 18,490 : width 18,150 caption 18,"Tester existence de ressource" : on_click 18,click18 edit 19 : top 19,210 : left 19,10 : width 19,700 inactive 19 : font_bold 19
button 20 : top 20,260 : left 20,240 : width 20,150 caption 20,"Extraire ressource dans fichier" : on_click 20,click20 edit 21 : top 21,290 : left 21,10 : width 21,700 inactive 21 : font_bold 21 save_dialog 22
dll_on "KGF.dll" end
' ***** ouvrir un fichier EXE/DLL ouvrir: filter 2,"Fichiers exécutables|*.exe;*.dll" f$ = file_name$(2) text 6,"" clear 4 if f$="_" return end_if res% = dll_call2("GetListOfResources",handle(3),adr(f$)) return ' ***** sélectionner un type de ressource sel3: s$ = item_index$(3) text 6,"" clear 4 if left$(s$,1)=" " then return if instr(s$,"Resource Number")=1 then return res% = dll_call3("GetIndexOfResourceType",handle(4),adr(f$),adr(s$)) text 6,s$ return ' ***** sélectionner une resource sel4: s$ = item_index$(4) text 11,"" s$ = left$(s$,instr(s$,"=")-1) text 11,s$ return ' ***** charger l'indexe du type de ressource choisi click7: clear 4 s$ = upper$(text$(6)) if s$="" then return if left$(s$,1)="!" then s$ = mid$(s$,2,len(s$)) if s$="" then return text 6,s$ res% = dll_call3("GetIndexOfResourceType",handle(4),adr(f$),adr(s$)) return ' **==* charger le contenu des données de la ligne indexe de la ressource choisie click12: s$ = string$(255," ") t$ = text$(6) n$ = text$(11) res% = dll_call4("GetResourceIndexItemData",adr(f$),adr(t$),adr(n$),adr(s$)) s$ = trim$(s$) text 13,s$ return ' ***** ajouter une nouvelle ressource click15: filter 2,"Tous fichiers|*.*" Text 19,"" r$ = file_name$(2) if r$="_" then return text 19,r$ t$ = text$(6) n$ = text$(11) res% = dll_call4("AddNewResource",adr(f$),adr(r$),adr(t$),adr(n$)) ' actualiser la liste des ressources res% = dll_call2("GetListOfResources",handle(3),adr(f$)) clear 4 text 6,"" text 11,"" text 13,"" return ' ***** remplacer une ressource click16: filter 2,"Tous fichiers|*.*" Text 19,"" r$ = file_name$(2) if r$="_" then return text 19,r$ t$ = text$(6) n$ = text$(11) res% = dll_call4("ReplaceExistingResource",adr(f$),adr(r$),adr(t$),adr(n$)) return
' ***** supprimer une ressource click17: t$ = text$(6) if t$="" then return n$ = text$(11) if n$="" then return res% = dll_call3("DeleteExistingResource",adr(f$),adr(t$),adr(n$)) ' actualiser la liste des ressources res% = dll_call2("GetListOfResources",handle(3),adr(f$)) clear 4 text 6,"" text 11,"" text 13,"" return
' ***** tester si une ressource existe click18: t$ = text$(6) if t$="" then return n$ = text$(11) if n$="" then return res% = dll_call3("FindExistingResource",adr(f$),adr(t$),adr(n$)) if res%=0 message "La ressource n'existe pas" else message "La ressource existe" end_if return ' ***** extraire une ressource existante dans un fichier click20: text 21,"" t$ = text$(6) if t$="" then return n$ = text$(11) if n$="" then return r$ = file_name$(22) if r$="_" then return res% = dll_call3("FindExistingResource",adr(f$),adr(t$),adr(n$)) if res%=0 then return res% = dll_call4("ExtractExistingResource",adr(f$),adr(t$),adr(n$),adr(r$)) if res%>0 then text 21,r$ return Bien sûr, pour des raisons évidentes d'intégrité d'un exécutable, un programme Panoramic en version EXE ne peut pas se modifier lui-même. Il peut seulement extraire une de ses propres ressources dans un fichier. C'est la raison d'existence de cet utilitaire. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 10:23 | |
| @papydall, Désolé, un changement de nom de variable malencontreux au dernier moment (nol%: nb d'octets par ligne au lieu de ll%: longueur ligne, révolutionnaire !) et ça ne marche plus ! c'est réparé là-haut et merci à toi de l'avoir signalé.
@Klaus, Il est bien évident que la solution que je suggère là-haut est pensée pour des applications toutes simples et un petit fichier à joindre, et pour que ce soit facile et rapide à mettre en oeuvre. Pour des applications avec des fichiers plus importants à joindre il faut évidemment adopter les solutions que tu préconises, et que je note d'ailleurs soigneusement. Mon but est que dans la mesure du possible il n'y ait qu'un fichier à transporter, l'application elle-même, quand on passe d'une machine à l'autre, et que ça ne présuppose pas d'autres applications non standards préinstallées (dans la mesure du possible).
Est-ce que ton système ne nécessite pas la présence de KGF.dll pour l'extraction des ressources incluses ? | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 11:05 | |
| Tel que, je crois que oui, il faut KGF installé mais Klaus avait fait un installeur, je crois dans lequel l'exe pouvait inclure tout le nécessaire pour pouvoir faire l'installation. Il me manque un maillon, mais globalement, il faudrait faire un executable avec les ressources qui se décompresse temporairement dans un répertoire de travail, qui installe tout et supprime ces traces d'installation (et que ça ) https://panoramic.1fr1.net/t3690-un-executable-qui-s-auto-edetruitmais bon, c'est vrai qu'il manque le lien entre ces 2 programmes pour avoir un programme d'installation totalement propre. je crois aussi me souvenir que Klaus avait fait une DLL légère spécialement pour les installations (j'espère que ma mémoire ne me joue pas de mauvais tours.) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 14:14 | |
| Mes DLLs ont pas mal évolué, à travers le temps. La seule DLL actuellement à jour et maintenue est KGF.dll, avec l'ensemble des fonctions.
KGF.dll doit bien entendu être présent pour que l'extraction d'une ressource marche - après tout, c'est une fonction de KGF.dll...
J'ai fait un installateur pour Synedit_Editor, qui installe également KGF.dll dans le dossier cible pour Synedit_Editor. Je peux faire une version simplifiée pour installer KGF.dll.
Une fois KGF.dll en place, les fonctions d'extraction de ressources sont disponibles, quelque soit la version de KGF.dll. Ces fonctions sont déjà anciennes et devraient être disponibles chez tous ceux qui utilisent actuellement KGF.dll. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 14:34 | |
| Donc si j'ai bien compris: j'écris et compile un petit programme pour mon voisin, qui nécessite mouse.dll. Je peux intégrer mouse.dll à la compilation de mon programme, mais je suis obligé de lui installer (chez mon voisin) Kgf.dll pour que le programme puisse extraire et installer mouse.dll... C'est justement ce que je voulais éviter dans un cas comme celui-ci (petit programme à destination ponctuelle, et petit fichier binaire joint) en proposant les deux petites subs là-haut | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 14:48 | |
| Je comprends bien ce que tu cherches, Jl35. Je n'ai pas de solution simple pour cela, et ta technique est efficace pour cela. Je voulais juste rappeler que pour des fichiers plus gros, ou des fichiers multiples, une solution existe pour ceux qui utilisent de toutes façon KGF.dll.
Ceci dit, dès le moment où l'on utilise un programme d'installation, copier temporairement KGF.dll dans un dossier temporaire, l'utiliser puis le supprimer, ça ne mange pas de pain. Les installateurs de logiciels du commerce font ça tout le temps. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Embarquer un fichier quelconque Ven 24 Avr 2015 - 15:01 | |
| C'est bien évident pour tout le monde je pense que KGF.dll est incontournable, et je ne me prive pas de l'utiliser, pour des fonctions que je suis incapable de réaliser sans lui, par exemple entre autres certaines fonctions qui existaient en freebasic et qui n'existent pas en panoramic, et tout un tas de fonctions nouvelles. Mon propos n'était destiné qu'à un besoin ponctuel et pour un cas très simple. | |
| | | Contenu sponsorisé
| Sujet: Re: Embarquer un fichier quelconque | |
| |
| | | | Embarquer un fichier quelconque | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |