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
» Problème de compilateur.
par Pedro Alvarez Hier à 20:01

» COMPILATEUR V 0.9 beta 8 du 18 aout 2017
par Pedro Alvarez Hier à 19:54

» Pb 17 (en analyse): ITEM_SELECT ne fonctionne pas
par Jack Jeu 17 Aoû 2017 - 19:26

» Compilateur FBPano
par Mike Jeu 17 Aoû 2017 - 13:52

» un nouveau editeur panobasic
par Jean Claude Jeu 17 Aoû 2017 - 10:18

» Le compilateur.
par Pedro Alvarez Jeu 17 Aoû 2017 - 8:36

» Pb 16 (en analyse): ON_CLOSE plante à l'exécution
par Jack Mer 16 Aoû 2017 - 20:00

» Pb 15 (en analyse): TIMER_ON plante à l'exécution
par Jack Mer 16 Aoû 2017 - 19:58

» KGF_dll - nouvelles versions
par Yannick Dim 13 Aoû 2017 - 17:35

» probleme d'outil
par Yannick Dim 13 Aoû 2017 - 17:32

» Carte de France des régions
par Yannick Sam 12 Aoû 2017 - 21:33

» Pb 14 (en analyse): PRINT_LOCATE plante à l'exécution
par Jack Ven 11 Aoû 2017 - 22:37

» Petit avertissement [Mots réservés]
par papydall Ven 11 Aoû 2017 - 13:45

» Distances sur plan
par JL35 Jeu 10 Aoû 2017 - 21:29

» Tracé : Triangle, Carrée, Dents de scie, Sinusoïde redressée
par papydall Jeu 10 Aoû 2017 - 14:52

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2017
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier

Partagez | 
 

 Embarquer un fichier quelconque

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



Nombre de messages : 5920
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Embarquer un fichier quelconque   Jeu 23 Avr 2015 - 17: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  Very Happy )

Edit 24/4 correction erreur de nom de variable (merci papydall)


Dernière édition par JL35 le Ven 24 Avr 2015 - 10:48, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5849
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Embarquer un fichier quelconque   Jeu 23 Avr 2015 - 17: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)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5920
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Embarquer un fichier quelconque   Jeu 23 Avr 2015 - 17: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')
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5849
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Embarquer un fichier quelconque   Jeu 23 Avr 2015 - 18: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 1: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...

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

Nombre de messages : 5508
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 1: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%?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

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

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 2: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5920
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 11: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 ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5849
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 12: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 Wink )

http://panoramic.free-boards.net/t3690-un-executable-qui-s-auto-edetruit

mais 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.)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 15: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5920
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 15: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 15: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5920
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Embarquer un fichier quelconque   Ven 24 Avr 2015 - 16: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Embarquer un fichier quelconque   

Revenir en haut Aller en bas
 
Embarquer un fichier quelconque
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» fichier Thunderbird Document
» faire une copie du fichier de la license de SZ ?
» fichier swf
» Fichier endommager
» inserer un fichier swf

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: