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 |
|
|
| Création d'une application avec Panoramic_Editor | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Création d'une application avec Panoramic_Editor Sam 12 Mai 2018 - 20:18 | |
| Depuis longtemps, Panoramic_Editor sait créer un fichier EXE en incluant des fichiers TXT, BMP et JPG. C'est la fonction de création d'application du menu "Fichiers" qui le fait. Or, dans certains cas, on aimerait embarquer d'autres fichiers, et surtout des fichiers binaires (DLL, ...). Impossible actuellement. Je vous propose aujourd'hui une solution simplissime 100 % Panoramic pour le faire quand-même. Je l'ai testé en "embarquant" KGF.dll, c'est vous dire ... L'astuce consiste en gros à créer, pour chaque fichier binaire, un fichier TXT contenant un dump hexa su fichier binaire. Ce fichier portera le même nom et aura l'extension TXT. Voici un utilitaire simple pour produire cela: - Code:
-
' hexify.bas ' ' This utility converts any binary file into a TXT file containing an hexadecimal dump ' of the binary file, with lines containing BlockSize%*2 characters. ' This kind of file can easyly be included into a Panoramic Application EXE file. ' Thus, any binary file can be used, not only TXT, JPG and BMP files. ' Please use the ExtractFiles procedure from the test_application.bas file to rebuild ' the binary files on program startup - see this program for documentation.
label opn, ext
dim f$, fout$, no%, no1%, no2%, ext$, buf$, siz%, siz0% dim BlockSize% : BlockSize% = 512
no% = no% + 1 : main_menu no% : no1% = no% no% = no% + 1 : sub_menu no% : no2% = no% : parent no%,no1% : caption no%,"Files" no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Open" : on_click no%,opn no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"-" no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Exit" : on_click no%,ext open_dialog 100 progress_bar 101 : top 101,40 : left 101,10 : width 101,width_client(0)-20
end
opn: ' ask for file to convert f$ = file_name$(100) if f$="_" then return if file_exists(f$)=0 message "File not found" return end_if ' build TXT file name ext$ = file_extract_extension$(f$) fout$ = left$(f$,len(f$)-len(ext$))+".txt" ' get binary file size filebin_open_read 1,f$ siz% = filebin_size(1) if siz%=0 message "File is empty" filebin_close 1 return end_if ' check if file exists if file_exists(fout$)=1 if message_confirmation_yes_no("Output file already exists. Replace ?")<>1 filebin_close 1 return end_if file_delete fout$ end_if ' conversion loop file_open_write 2,fout$ siz0% = siz% max 101,siz0% ' do as many full block reads as possible while siz%>=BlockSize% position 101,siz0%-siz% buf$ = filebin_hexa_read$(1,BlockSize%) file_writeln 2,buf$ siz% = siz% - BlockSize% end_while ' eventually, do a final partial block if siz%>0 position 101,siz0% buf$ = filebin_hexa_read$(1,siz%) file_writeln 2,buf$ end_if ' done position 101,siz0% filebin_close 1 file_close 2 message "File created:"+chr$(13)+chr$(10)+fout$ position 101,0 return ext: terminate
Et voici une démo simple montrant l'utilisation. Ce programme vérifie si KGF.dll est présent. Si oui, rien ne se passe. Si KGF.dll est absent, une procedure ExtractFiles() est appelée. Cette procédure va extraire tous les fichiers binaires emparquées, en s'aidant d'un fichier index en format TXT qui donne, pour chaque fichier binaire, le nom du fichier hexifiée, puis le nom du fichier binaire, éventuellement avec son chemin. Toutes les explications sont dans le code: - Code:
-
' test_application.bas ' ' This program is for demonstration purposes only. ' It show how to include any binary file into a Panoramic Application EXE file. ' Using the hexify utility, any binary file can be converted to an hexa dump ' in TXT format. Same file name, but *.TXT extension. Thus, the file will be ' flawlessly integrated into the application. ' As many binary files as required may be included in the same way. ' A supplemental TXT file must be supplied, giving the index of all included ' binary files, in the following format: ' index file name: IndexOfIncludedFiles.txt ' index file content: ' first line: #IndexOfIncludedFiles ' followed by 2 lines for each binary file. The first of them is the name ' of the hexified TXT file, without path. The second of them is the target ' file name, eventually including the destination path ' Example: ' #IndexOfIncludedFiles <=== first line as identifyer ' KGFdll.txt <=== name of the hexified TXT file ' KGF.dll <=== name of the resulting binary output file ' ...
dim res%, vers$, KGF$ KGF$ = "KGF.dll"
if file_exists(KGF$)=0 then ExtractFiles() message "Ready..."
end
sub ExtractFiles() dim_local s$, fincluded$, foutput$, nobj%, n% nobj% = 1 while object_exists(nobj%)=1 nobj% = nobj% + 1 end_while dlist nobj% file_load nobj%,"IndexOfIncludedFiles.txt" n% = 1 s$ = item_read$(nobj%,n%) if s$<>"#IndexOfIncludedFiles" message "Invalid index file" delete nobj% exit_sub end_if while n%<count(nobj%) n% = n% + 1 fincluded$ = item_read$(nobj%,n%) n% = n% + 1 foutput$ = item_read$(nobj%,n%) file_open_read 1,fincluded$ filebin_open_write 2,foutput$ while file_eof(1)=0 file_readln 1,s$ filebin_hexa_write 2,len(s$)/2,s$ end_while filebin_close 2 file_close 1 end_while delete nobj% end_sub
Dernière édition par Klaus le Dim 13 Mai 2018 - 8:18, édité 1 fois | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Création d'une application avec Panoramic_Editor Dim 13 Mai 2018 - 2:38 | |
| Salut Klaus Voilà une excellente idée ! J’ai testé. Pour hexify.bas il y un caractère superflu en ligne 72 ( un point en fin de ligne) - Code:
-
position 101,siz0% .
Pour test_application.bas, j’obtiens l’erreur Impossible to load the File. Line : 39 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Création d'une application avec Panoramic_Editor Dim 13 Mai 2018 - 8:27 | |
| Merci d'avoir testé ! - Citation :
- Pour hexify.bas il y un caractère superflu en ligne 72 ( un point en fin de ligne)
C'est corrigé en haut. Bizarre que ça ne génère pas d'erreur... - Citation :
- Pour test_application.bas, j’obtiens l’erreur
Impossible to load the File. Line : 39 Est-ce que tu as généré ce programme en "application", en présence du fichier IndexOfIncludedFiles.txt tel que c'est décrit dans les commentaires, et un fichier TXT issu de hexify.bas ? Ce message vient en deux circonstances: - tu as lancé le programme directement dans Panoramic_Editor, ou génére en exécutable (dans ce cas, le fichier IndexOfIncludedFiles.txt manque forcément...) - tu tentes de lancer le programme généré en application par Panoramic_Editor, mais sans arrêter Panoramic_Editor (dans ce cas, tu tombes dans le problème que j'ai signalé iciC'est une démo "proof of concept", montrant la faisabilité. On pourrait aisément ajouter toute une série de tests pour vérifier la présence ou non du fichier IndexOfIncludedFiles.txt, pour vérifier la présence de chacun des fichiers hexifiés indiqués dans IndexOfIncludedFiles.txt, etc. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Création d'une application avec Panoramic_Editor Dim 13 Mai 2018 - 18:42 | |
| J'ai fait un petit programme 100 % Panoramic qui permet d'analyser un fichier EXE pour en extraire les noms des fichiers embarqués en tant qu'application, si tel est le cas. Et pour faire bonne mesure, j'ai ajouté le test si le petit fichier index est présent, ce fichier donnant la liste des fichiers binaires hexifiés: - Code:
-
' ExeResourceManager.bas
label open, exit
dim no%, no1%, no2%, no_open%, no_names% dim f$, ext$, a%, an%, k%, s$, buf%(256), PEheader%, v%, SectionCount% dim ResourceSection%, SectionOffset%, SizeOfResources%, PointerToResources% dim ResourceNameEntries%, ResourceIdEntries%, RCDATApointer% dim PointerToRCDATA%, RcDataResourceNameEntries%, RcDataResourceIdEntries%
no% = no% + 1 : main_menu no% : no1% = no% no% = no% + 1 : sub_menu no% : no2% = no% : parent no%,no1% : caption no%,"Files" no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Open" : on_click no%,open no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"-" no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Exit" : on_click no%,exit no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"EXE or DLL files|*.exe;*.dll" no% = no% + 1 : list no% : no_names% = no% top no%,10 : left no%,10 : width no%,300 : height no%,200 caption 0,"ExeResourceManager"
end open: f$ = file_name$(no_open%) if f$="_" then return if file_exists(f$)=0 message "File not found" return end_if ext$ = lower$(file_extract_extension$(f$)) if (ext$<>".exe") and (ext$<>".dll") message "Wrong file type (EXE or DLL)" return end_if AnalyzeExeFile() if CheckIfFileIsIncluded("IndexOfIncludedFiles.txt")=1 message "Le fichier index est bien présent" else message "Le fichier index est absent" end_if return exit: terminate sub AnalyzeExeFile() filebin_open_read 1,f$ : ' open the selected EXE or DLL file ' at offset hex("3C") is located the length of the MS-DOS header. ' this is also the start offset for the PE header a% = Read32(hex("3C"))
' at this point, there must be the PE signature (letters PE followed by 2 zero bytes) v% = Read32(a%) if v%<>hex("00004550") message "Invalid EXE or DLL file" filebin_close 1 : ' close the file exit_sub end_if PEheader% = a% + 4 : ' skip the PE signature to point to the PE header ' at offset 2 of the PEheader, there is the section count as 16 bit number SectionCount% = Read16(PEheader%+2)
' at offset 16 of the PEheader, there is the size of the optional header as 16 bit number v% = Read16(PEheader%+16)
' now, point after the header (20 bytes) and after the optional header (v% bytes) a% = PEheader% + 20 + v% ' here is the section table - 40 bytes of section header for each section. ' the first 8 bytes are the ASCII section name: ResourceSection% = 0 for k%=1 to SectionCount% s$ = ReadString$(a%,8) if s$=".rsrc" ResourceSection% = k% SectionOffset% = a% end_if a% = a% + 40 next k% if ResourceSection%=0 message "Resource section .rsrc not found" filebin_close 1 : ' close the file exit_sub end_if
' here, the resource section header is identified. ' at offset 16, there is the 32 bit section size ' at offset 20, there is the 32 bit section pointer SizeOfResources% = Read32(SectionOffset%+16) PointerToResources% = Read32(SectionOffset%+20) ' PointerToResources% contains the pointer to the resource directory table header ' at offset 12, there is the 16 bit number of name entries ' at offset 14, there is the 16 bit number of ID entries ResourceNameEntries% = Read16(PointerToResources%+12) ResourceIdEntries% = Read16(PointerToResources%+14) if ResourceNameEntries%>0 a% = PointerToResources% + 16 RCDATApointer% = 0 for k%=1 to ResourceNameEntries% an% = PointerToResources% + bin_and(Read32(a%),hex("0FFFFFFF")) s$ = ReadUnicodeString$(an%) if s$="RCDATA" RCDATApointer% = Read32(a%+4) end_if a% = a% + 8 next k% end_if if RCDATApointer%=0 message "RCDATA section not found" filebin_close 1 : ' close the file exit_sub end_if ' here, RCDATApointer% contains the pointer to the data for the RCDATA section. ' if high bit is set, this is an offset to a resource directory entry, ' otherwise, it is just an offset to the data. if bin_and(RCDATApointer%,hex("80000000"))=0 ' actually not used... else : ' here, we have an offset to lower level resource directory header PointerToRCDATA% = PointerToResources% + bin_and(RCDATApointer%,hex("0FFFFFFF")) ' at offset 12, there is the 16 bit number of name entries ' at offset 14, there is the 16 bit number of ID entries RcDataResourceNameEntries% = Read16(PointerToRCDATA%+12) RcDataResourceIdEntries% = Read16(PointerToRCDATA%+14)
if RcDataResourceNameEntries%=0 message "No included resource file" filebin_close 1 : ' close the file exit_sub end_if ' here, the names entries indicate the included files for the applciation a% = PointerToRCDATA%+16 clear no_names% for k%=1 to RcDataResourceNameEntries% an% = PointerToResources% + bin_and(Read32(a%),hex("0FFFFFFF")) s$ = ReadUnicodeString$(an%) ' here we have the names of the included resource files item_add no_names%,s$ a% = a% + 8 next k% end_if filebin_close 1 : ' close the file end_sub ' this function reads a 32 bit word from the specified offset and returns its value fnc Read32(offset%) filebin_position 1,offset% filebin_block_read 1,4,buf%(0) result ((buf%(3)*256+buf%(2))*256+buf%(1))*256+buf%(0) end_fnc
' this function reads a 16 bit word from the specified offset and returns its value fnc Read16(offset%) filebin_position 1,offset% filebin_block_read 1,2,buf%(0) result buf%(1)*256+buf%(0) end_fnc
' this function reads a n byte string from the specified offset and returns the string fnc ReadString$(offset%,n%) dim_local i%, s$, c% filebin_position 1,offset% s$ = "" for i%=1 to n% c% = filebin_read(1) if c%<>0 then s$ = s$ + chr$(c%) next i% result s$ end_fnc
' this function reads a Unicode resource name string from the specified offset and returns it as ASCII string fnc ReadUnicodeString$(offset%) dim_local s$, c%, n%, i% s$ = "" n% = Read16(offset%) for i%=1 to n% c% = filebin_read(1) s$ = s$ + chr$(c%) c% = filebin_read(1) : ' skip the Unicode extension unsused in Panoramic ! next i% result s$ end_fnc
fnc CheckIfFileIsIncluded(file$) dim_local res%, i% res% = 0 if count(no_names%)=0 then exit_fnc for i%=1 to count(no_names%) if item_read$(no_names%,i%)=upper$(file$) then res% = 1 next i% result res% end_fnc
Ca marche sur tous les EXEs créés par Panoramic, qu'ils soient "application" ou non. Mais quelle galère ! On pourrait éviter tout cela avec deux lignes si ma suggestion d'une fonction APPLICATION_FILE_EXISTS était implémentée ( voir ma proposition ici ) | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 14 Mai 2018 - 12:35 | |
| Oui, effectivement. Et on est loin d' avoir tous tes connaissances. En tout cas, Bravo pour ce code. | |
| | | Fredisland
Nombre de messages : 261 Date d'inscription : 30/03/2018
| Sujet: Re: Création d'une application avec Panoramic_Editor Lun 14 Mai 2018 - 13:13 | |
| Eh bien c'est parfait tour ça, ça repond à mes questions. | |
| | | Oscaribout
Nombre de messages : 471 Date d'inscription : 29/12/2016
| Sujet: Re: Création d'une application avec Panoramic_Editor Lun 14 Mai 2018 - 13:58 | |
| Bonjour, C'est pas méchant, mais je suis surpris que depuis quelques temps, alors qu'on est sur un site français, on mette systématiquement les commentaires en anglais. On est devenu peu de choses. Il y en a qui vont dire que la programmation c'est l'affaire des américains, et qu'il n'y a rien à dire, c'est comme celà. C'est une phrase que des vendeurs tenaient dans les années 80 et qu'on m'a souvent dit à cette époque. Je sais que j'aimerai bien avoir 30 ans de moins mais tout de même! Je sais ce que je dis et rien, c'est pareil. donc je m'en vais. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Création d'une application avec Panoramic_Editor Lun 14 Mai 2018 - 15:08 | |
| Sur le fond, je suis d'accord avec toi, Oscaribout. Formu français - contributions en français. D'ailleurs, tous mes programmes sont en français - code, commentaires et documentation.
Je viens de faire une exception, et je l'assume totalement. J'ai posté un utilitaire permettant de chercher dans un fichier EXE ou DLL, spécifiquement les ressources de la catégorie RCDATA. Ce sont ceux qui contiennent les fichiers embarqués en mode "application", par Panoramic_Editor.
C'est un outil extrêmement technique, pour un usage bien spécifique. et je pense qu'il peut avoir un intérêt, au-delà du forum français. Ce forum français intéresse d'ailleurs de temps en temps des membres non francophones, comme récemment Jennyk avec qui j'ai eu un petit échange en anglais. Et comme la fin de cette discussion portait sur les fichiers embarqués, je me suis dit que cet outil pourrait également l'intéresser.
J'ai déjà eu des échanges avec des membres en allemand et même en portugais (brésilien). Il se trouve que je suis plus que bilingue et peux, de ce fait, intervenir auprès de membres ayant des difficultés en Français. Je n'oublie jamais que le Français n'est pas ma langue maternelle, mais seulement ma deuxième langue étrangère à l'école (eh oui, ma première langue étrangère était le Latin...). Je fais donc cela, sporadiquement, simplement pour mettre à l'aise des Panoramiciens présents rarement pour cause de barrière de langue.
J'ai bien l'intention de continuer, si le besoin s'en fait sentir. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Création d'une application avec Panoramic_Editor Lun 14 Mai 2018 - 17:10 | |
| Klaus, concernant ton système de conversion binaire -> hexa (texte), puis reconversion hexa -> binaire
Est-ce qu'il ne pourrait pas y avoir dans le binaire originel quelque part les valeurs successives 1310 qui seront traduites et écrites dans le fichier texte comme '0D0A'
A la relecture du fichier (mode texte, donc ligne par ligne) pour reconversion en binaire, ce sera considéré comme un saut de ligne et donc escamoté en lecture... ?
Ou je n'ai pas bien regardé ?
PS Vérification faite, apparemment ça ne gêne pas, j'ai fait une sub qui recopie entièrement le binaire dans une seule variable, en hexa, laquelle variable est écrite dans un fichier texte. A la reconversion, les '0D0A' éventuels sont bien reconstitués. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Création d'une application avec Panoramic_Editor Lun 14 Mai 2018 - 22:07 | |
| Oui, JL35, ça marche bien. J'ai même essayé avec un vrai fichier texte (un fichier source Panoramic).
Le fichier "hexifié" contient vraiment le dump hexa, y comprir d'éventuels CR LF convertis en 0D 0A. Chaque ligne contient le code hexa de 512 octets (donc 1024 caractères), suivi du CR LF délimitant la ligne du fichier texte. La dernière ligne du fichier hexifié contient le reste dépassant un multiple de 512 octes, également suivi d'un CR LF.
A la reconstitution, on lit le fichier hexifié en lecture séquentielle, et on obtient des lignes de 1024 caractères, évidemment sans le CR LF terminal. Après reconversion en binaire, on récupère les 512 octets binaires, y compris d'eventuels CR LF présents dans le fichier hexifié sous forme de 0D 0A et non CR LF. Donc, tout se goupille parfaitement. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Création d'une application avec Panoramic_Editor Lun 14 Mai 2018 - 22:15 | |
| Tu as raison Klaus, j'ai eu un doute qui s'est dissipé, avec l'expérience et tes explications. Et effectivement c'est très intéressant et astucieux comme système pour intégrer du binaire dans une application Panoramic. Avec éventuellement d'autres usages, à voir. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Création d'une application avec Panoramic_Editor Mar 15 Mai 2018 - 0:36 | |
| J'apporte une information supplémentaire, même si, sur le fond, il n'y a rien de nouveau: Comme ce mécanisme de hexification peut s'appliquer à n'importe quel fichier, il peut à l'évidence s'appliquer à un fichier ZIP. Et on peut ainsi embarquer, en un seul fichier ZIP hexifié, des dizaines de fichiers de toutes sortes, y compris leur arborescence de dossiers. Puis, au lancement du programme, on peut extraire ce fichier, reconstituer le ZIP d'origine, puis décompresser le ZIP selon les 3 moyens à disposition: - les commandes ARCHIVER_xxx - les fonctions ZIP de KGF.dll - un fichier BAT appelant ZIP en mode DOS On a là de puissants moyens d'installation d'applications complexes, sans avoir besoin de recourir à un logiciel externe de création d'un programme d'installation, au moins tant qu'une installation se résume à la création de dossiers et la copie de fichiers, ce qui devrait être la majeure partie des cas. | |
| | | Contenu sponsorisé
| Sujet: Re: Création d'une application avec Panoramic_Editor | |
| |
| | | | Création d'une application avec Panoramic_Editor | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |