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 |
|
|
| V3.13 du 10/07/2014 - gestion des ressources | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: V3.13 du 10/07/2014 - gestion des ressources Ven 11 Juil 2014 - 1:56 | |
| Nouvelle version: KGF.dll V3.13 du 10/07/2014Nouveauté: un jeu de 8 fonctions pour gérer les ressources dans un fichier en format PE (*.EXE et *.DLL)Modules modifiés: KGF.dll KGF.chm KGF.doc KGF.pdfLa doc et les sources sont à jour. Ces fonctions sont documentées dans la rubrique Gestion des ressources, tout à la fin de la liste des rubriques dans le fichier d'aide. Ceci représente un gros morceau, et c'est fonctionnellement assez puissant. Avec cela, on peut ajouter, remplacer ou supprimer des ressources pour un programme Panoramic (mais pas que...). Ces ressources, dans cette conception, sont des fichiers dont le contenu est copié dans le fichier visé, sous forme de ressource Windows. Ceci permet de créer des installateurs en un seul fichier, en y incluant tous les modules à distribuer, y compris des fichiers binaires, des fichiers EXE, DLL, ZIP, DOC etc. N'importe quoi qui soit sous forme de fichier. On peut les extraire dans un fichier du même nom que celui d'origine (celui-ci sera mémorisé !) ou sous un autre nom. On peut tester l'existence d'une ressource, la remplacer par une autre ou la supprimer. On peut aussi récupérer les noms de toutes les ressources présentes dans le fichier, ainsi que les ressources spécifiques à un type de ressource donné. Cela peut aussi servir pour un jeu, par exemple, qui peut embarquer tous ses modules spécifiques, comme des objets 3D, des mesh, des musiques, des textures, des fichiers de configuration etc. Contrairement à la notion d'application de Panoramic, on peut ici utiliser n'importe quel fichier, texte, image de toutes sortes, fichiers binaires etc. Aucune limite. Seule contrainte: on ne peut pas modifier le fichier EXE ou DLL du programme lui-même, celui qui est en cours. Mais on peut le lire et extraire les ressources. Avec les fonctions présentes, il est facile d'écrire un petit programme Panoramic qui ajoute les ressources nécessaires à un EXE écrit en Panoramic, de sorte que celui-ci puisse ensuite à s'en servir, à l'aide également de ces fonctions. Juste un petit rappel de ce que sont les ressources Windows. Une ressource est une portion de données quelconques, qui est référencée dans Windows par un type de ressource et un nom de ressource. Ces deux informations forment l'identification unique d'une ressource. Normalement, l'ensemble des ressources sont copiées dans l'exécutable lors de sa création, à partir d'un fichier *.RES qui doit au préalable être compilé à partir d'un fichier *.RC. Mais des API Windows permettent de modifier cela dynamiquement, et c'est ce que je rends accessible ici. Mise en garde importante:Les ressources sont une partie vitale pour n'importe quel programme. Leur modification ou suppression inconsidérées peuvent empêcher le programme de fonctionner, voire même conduire à des plantages sévères. C'est pourquoi je conseille fortement d'utiliser systématiquement des noms des types de ressources inconnus de Windows, par exemple PANORAMIC_RESSOURCE_1 ou similaire. Et toutes les ressources chargées par ces fonctions doivent se trouver sous un de ces types privatifs.On peut créer autant de types de ressources que nécessaire. Et chaque type peut contenir un nombre quelconque de ressources. Et afin de mieux gérer ces ressources, mes routines créent autiomatiquement une ressource spécifique pour chaque type: c'est une ressource indexe du nom de !INDEX_xxx où xxx est le nom du type correspondant. Et cette ressource indexe contient une liste en format texte dont chaque ligne décrit une ressource créée pour ce type de ressources, selon le format NomDeRessource="X:\...\...\fichier_de_ressource.ext" Une des nouvelles fonctions permet de retourner le contenu de cette ressource indexe pour un type de ressources donné. On a ainsi, pour chaque ressource, le nom du fichier et son type. Et pour finir, un petit programme Panoramic qui peut servir de gestionnaire de ressources: - 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
A vous d'inventer votre utilisation de ces fonctions !
Dernière édition par Klaus le Ven 11 Juil 2014 - 15:07, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: V3.13 du 10/07/2014 - gestion des ressources Ven 11 Juil 2014 - 7:23 | |
| Je n'ai pas encore essayé, mais c'est pratique et puissant. C'est vrai que les premières idées d'utilisation est la création de programme d'installation mais il peut y avoir d'autres usages. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V3.13 du 10/07/2014 - gestion des ressources Sam 12 Juil 2014 - 0:55 | |
| J'ai ajouté une DLL dans mon WebDav, dossier DLLs\. Cette DLL s'appelle Resource.dll. Elle contient uniquement les 5 fonctions suivantes: GetIndexOfResourceType = récupérer l'indexe d'un type de ressource dans un LIST GetListOfResources = récupérer la liste de toutes les resources dans un LIST GetResourceIndexItemData = récupérer le chemin d'accès au fichier d'origine d'une ressource FindExistingResource = tester si une ressource existe ExtractExistingResource = extraire une ressource dans un fichier
Ainsi, cette DLL peut servir de "véhicule" pour des ressources. On peut lui intégrer toutes les ressources nécessaires, par exemple par le gestionnaire de ressources publié ci-dessus. Ensuite, elle peut être intégrée elle-même dans un exécutable Panoramic, également par le gestionnaire de ressources posté ci-dessus.
Puis, cet exécutable Panoramic peut l'extraire de lui-même au premier démarrage (c'est-à-dire si ce fichier n'existe pas). A partir de là, le programme peut l'utiliser, en fermant KGF.dll et en ouvrant Resource.dll pour utiliser les fonctions ci-dessus, ou alors en utilisant ces fonctions directement à partir de KGF.dll, pour en extraire les ressources nécessaires dans des fichiers individuels.
Le grand avantage, c'est que le programme Panoramic en cours peur librement modifier les ressources dans cette DLL, par ajout d'autres ressources, remplacement de ressources voire même suppression de ressources, et ce en cours d'exécution, sans contrainte, a condition que cette DLL ne soit pas chargée à ce moment-là. On évite ainsi le blocage sécuritaire de Windows et on obtient un système de gestion dynamique des ressources.
Ceci peut servir, par exemple, pour la sécurisation de données sensibles. KGF.dll contient une fonction de cryptage, propriétaire, assez puissante. On peut imaginer un fichier sensible, crypté et mémorisé sous forme de ressource dans cette petite DLL. En cours d'exécution, on l'extrait et on le décrypte. A chaque modification, on le recrypte et on le met à jour dans la DLL. Et dans l'évènement ON_CLOSE de la form 0, on supprime ce fichier, si possible avec la fonction de suppression sécurisée également disponible dans KGF.dll. Ce n'est peut-être pas parfait comme sécurité, mais c'est déjà une bonne approche... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 12 Juil 2014 - 12:21 | |
| Je vais sans doute dire une grosse bêtise... Ceci peut il servir, par exemple, à changer l' icône d' un *.exe créé avec panoramic ?... Aïe,aïe,aïe...tapez pas trop fort sur la pauvre bête... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V3.13 du 10/07/2014 - gestion des ressources Sam 12 Juil 2014 - 12:42 | |
| Non, on ne peut pas. Il est très délicat d'intervenir sur les ressources existantes d'un fichier exécutable. Comme je l'ai dit dans mon post initial, cela peut entraîner des conséquences graves, et c'est pourquoi j'ai bloqué cela.
Pour changer l'icône d'un exécutable Panoramic, il y a l'excellent ResHacker (freeware) qui fait ça très bien. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 12 Juil 2014 - 12:56 | |
| C' est ce que j'utilise actuellement. Je trouvais que le faire avec Panoramic et KGF aurait été sympa... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V3.13 du 10/07/2014 - gestion des ressources Sam 12 Juil 2014 - 13:14 | |
| Certes. Mais les icônes sont gérées d'une manière particulière, différente des autres ressources. Et je n'ai pas envie de me risquer à semer la pagaille dans ce bazar, d'autant que ce serait juste pour une unique fois, après la génération de l'EXE. Et que ce soit un programme Panoramic ou ResHacker, dans ce cas, ça revient au même.
Ce que j'ai fait, c'est de donner le moyen de gérer ce que la notion "application" de Panoramic fait, mais avec plus de souplesse (en acceptant absolument tous les fichiers) et en le gérant dynamiquement. donc, installateurs, jeux, applications auto-extractibles, programmes sécurisés par des données cryptées, ... Voilà un peu le créneau que je vise. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V3.13 du 10/07/2014 - gestion des ressources Dim 13 Juil 2014 - 16:45 | |
| J'ai trouvé un code Visual Basic qui arrive à faire cela: changer l'icône d'un fichier EXE. Je vais le traduire en Delphi et l'intégrér dans KGF.dll. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 13 Juil 2014 - 16:52 | |
| | |
| | | Contenu sponsorisé
| Sujet: Re: V3.13 du 10/07/2014 - gestion des ressources | |
| |
| | | | V3.13 du 10/07/2014 - gestion des ressources | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |