[R] lire une ressource TXT dans une DLL

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

[R] lire une ressource TXT dans une DLL

#1

Message par zeshrek »

Alors avant tout, je vouslais dire que j'ai lu tout ce que j'ai pu trouver concernant les DLL (je me suis même appuyé le forum autoit allemand, moi qui n'ai aucun atome crochu avec cette langue !) il y q qq temps quand j'ai voulu mettre des icones dans une DLL.
Ca j'ai compris.
Mettre une image aussi j'ai compris, vu que c'est l'exemple le plus souvent donné dans les tutos (que ce soit les FR ou les EN)
Par contre, ce que je n'arrive pas a faire, c'est lire des fichiers texte dans la DLL !

Donc j'ai créé un premier fichier, FILE0.TXT contenant ceci :

Code : Tout sélectionner

File0 line1
File0 Line2
j'en ai fait un second, FILE1.TXT contenant ceci :

Code : Tout sélectionner

File1 line1
File1 Line2
Puis a partir de ces fichiers, j'ai créé une DLL avec l'excélent outil de Tlem (a ce sujet, bravo boss !) que je joins aussi.

Puis j'ai créé le scritp suivant pour éssayer de lire mes fichiers contenus dans la DLL :

Code : Tout sélectionner

#include "resources.au3"
$text=_ResourceGetAsString("FILE0", $RT_RCDATA, 1033, "AsciiFiles.dll")
ConsoleWrite(@crlf&$text&@CRLF&@CRLF)
Et ca marche pas !
j'obtiens un message disant qu'autoit crash, et qu'il faut le fermer.
j'ai éssayé de remplacer "1033" par un zero ou $ResLang, sans succes.

Y a un truc que j'ai loupé ?
Fichiers joints
AsciiFiles.zip
(784 Octets) Téléchargé 374 fois
Si vis pacem para bellum
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#2

Message par Tlem »

Après de longues recherches, j'en déduit que cela ne peut fonctionner avec une DLL ... :(
En tout cas en l'état.

J'ai regardé tout ça et il semble que lors de la compilation de la DLL, les ressource TXT sont ajoutée en STRING et non RCDATA.
Mais même si on essaye de faire une lecture avec $RT_STRING, cela ne fonctionne pas (sans compter sur le plantage AutoIt).
Je me suis dit qu'il fallait absolument que la ressource soit en RCDATA.
Donc j'ai renommer TEXT0.TXT et TEXT1.TXT en TEXT0.DAT et TEXT1.DAT, mais le problème reste identique bien que les ressources soient en RCDATA !!!
Je me suis dit aussi que la DLL était mal compilée, donc j'ai recherché sur mon PC une DLL avec en RCDATA du texte.
Et bien là non plus ça ne fonctionne pas !!!

Donc j'ai fouillé resources.au3, et j'en viens à la conclusion que le problème (plantage AutoIt) viendrait de cette partie de la fonction _ResourceGet :

Code : Tout sélectionner

$hInstance = _WinAPI_LoadLibrary($DLL)
Mais même si on utilise _WinAPI_LoadLibraryEx en passant par toutes les options, le problème persiste. :cry:

Je n'ai pas chercher avec les autres fonctions de resources.au3 en dehors de _ResourceGetAsString et _ResourceGetAsStringW, car tout tourne autour de _ResourceGet.

Maintenant, si on compile les ressources dans l'exe, tout fonctionne correctement.
Bon, c'est une demi solution, mais c'est une solution quand même ... :mrgreen:

Code : Tout sélectionner

#AutoIt3Wrapper_Res_File_Add=FILE0.TXT, rt_rcdata, FILE0
#AutoIt3Wrapper_Res_File_Add=FILE1.TXT, rt_rcdata, FILE1

#include "resources.au3"

$text=_ResourceGetAsString("FILE0")
MsgBox(0, 'Premier fichier', $text)
$text=_ResourceGetAsString("FILE1")
MsgBox(0, 'Deuxième fichier', $text)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#3

Message par zeshrek »

Hello Tlem
Tout d'abord, merci de t'etre penché sur mon problème. Je galère dessus depuis plusieurs jours, par contre je n'étais pas rendu a la meme conclusion que toi.
A priori _ResourceGet fonctionne (elle me renvoie bien ce qui semble etre l'index et la longueur du fichier texte)
Par contre le bug semble se situer sur l'avant dernière ligne de _ResourceGetAsString :

Code : Tout sélectionner

$struct = DllStructCreate("char[" & $ResSize & "]", $ResPointer)
Ella a l'air correcte, mais c'est elle qui fait planter le bouzin.
Pas de bol...
Sinon, j'ai éssayé de faire une StringTable, mais le hic c'est qu'on est limité a 16 lignes, et j'en ai beaucoup plus a mettre.

La solution d'incorporer les fichiers dans l'exe est effectivement possible, le hic c'est que je voulais plutot alleger mon exe pour ne conserver en mémoire que ce qui est nécéssaire.
Or je n'ai pas besoin du contenu de tous mes fichier en même temps. Et en plus pour les mise a jour, c'est moins lourd de juste updater la DLL que de devoir recompiler l'exe.
Ou alors je pourais aussi avoir mes fichiers a coté, sous forme de txt chargé au fur et a mesure des besoins.
Sauf que ces nom de zeus de DLL existent, et que j'aimerai bien que ca marche :(
On peut y mettre des icones, des images, mais du bête texte, impossible. c'est quand même frustrant non ?
Si vis pacem para bellum
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#4

Message par Tlem »

Je ne suis pas sur que les ressources soient chargées en mémoire ... :roll:
Mais, bon, comme tu l'a souligné, pour la maintenance, c'est plutôt moyen.

Mais si il n'y à que ca qui t'arrète, pourquoi ne pas tout simplement remplacer la DLL par un EXE 'bidon' qui ne sera là que pour les ressources. :mrgreen:

En fait, entre un fichier .exe ou une .dll, la différence n'est pas si énorme. 8)
Tu pourrait le gérer comme une boite de 'A propos' et y coller tes ressources au fur et à mesure. Comme cela, si quelqun clique dessus, il verra cette boite de 'A propos' ...

Bon, l'inconveignant c'est que ton fichier fera au minimum 500Ko pour l'interpréteur, mais si tu y met pas mal de ressources, ca devrait passer plus ou moins inaperçu. ^^
En plus pour l'ajout de ressources, ce serait bien plus simpa et pratique car tu n'aurait qu'à alimenter tes lignes :

Code : Tout sélectionner

#AutoIt3Wrapper_Res_File_Add=
plus besoin de ce taper la création de la DLL à la main.
Un simple dossier ressource avec le script qui va bien et hop ...
Je suis sur qu'on peut même automatiser l'ajout des ressources en gerant les extention de fichiers et là, ho merveille de la technologie et de l'automatisme avec AutoIt, tu ne t'embêtera plus à ajouter tes ressources.

Aller, un petit 'défit' pour celui que ca va amuser.
Le but sera de créer un script qui va générer automatiquement un exe de ressources (il m'est d'avis, que ce sera un script très utile).
1 - Analyser les fichiers d'un dossier que l'on nommera 'Ressources".
2 - Générer un script au3 qui lors de sa compilation ajoutera automatiquement les ressources disponibles du dossier, sur la base de :

Code : Tout sélectionner

#AutoIt3Wrapper_Res_File_Add=
3 - Compilation automatique du script au3 avec prise en charge de l'extraction automatique des ressources qu'il contient grace à une ligne de commande du genre '/src', prise en compte des infos additionnels du script par un fichier d'entête (que l'on appelera fileinfo.au3) qui résumera ce que l'on rajoute sur les directives du wrapper pour donner le nom de sortie, la version, le copyright, etc ...

Voilà déjà de quoi occupé au moins quelques heures pour les plus tenace et quelque jours pour les autres. :lol:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#5

Message par jchd »

Par contre le bug semble se situer sur l'avant dernière ligne de _ResourceGetAsString :

Code : Tout sélectionner

$struct = DllStructCreate("char[" & $ResSize & "]", $ResPointer)
Ella a l'air correcte, mais c'est elle qui fait planter le bouzin.

Sincèrement, je n'ai pas le temps de creuser ça, mais juste en zieutant la dll que tu as posté tes chaînes sont en UTF-16 (Unicode). Ce qui m'étonne est que _ResourceGetAsStringW plante pareil dixit le big boss.

Bah, Zedna va te trouver la solution si tu mets un cierge (en le payant) et que tu pries très fort...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#6

Message par zeshrek »

@ Tlem
Hmmm... Les ressources sont forcément chargées en memoire puisqu'elles font partie intgrante du fichier exe
je ne crois pas que Windows s'amuse a tronconer un exe pour ne garder en ram que ce ont il se sert a un instant donné.
Alors oui bien sur il y a la solution d'un exe bidon qui me servirait de DLL, ou même carrément je me fais mon propre format de fichier de ressource. Apres tout, c'est possible (tout est possible). Mais bon, les DLL sont faite pour ca, alors j'aimerai bien les utiliser :D
En plus pour faire des dll, j'ai vu qu'il y avait tout ce qui est nécéssaire gracieusement mis a dispo par SM dans Visual BasicExpress (il suffit de créer un nouveau projet DLL, d'inclure les ressources, et de compiler, presque aussi simple que ton RDG.exe)

@jchd
Oui, j'en étais parvenu au même point, c'est bien cette ligne qui plante (en fait, j'en suis sur, j'avais msi des msgbox a chaque ligne pour voir ou ca plantait :D).
Sauf qu'elle ne devrait pas
Et je confirme que _ResourceGetAsString et _ResourceGetAsStringW plantent exactement pareil. Et au même endroit, sur l'avant dernière ligne.

'fin bon, je suis en pleine discussion avec Zedna surle forum US, et il est autant dans le brouillard que nous. Il m'a fait la mêem suggestion que Tlem et d'utiliser des #AutoIt3Wrapper_Res_File_Add= !

Ca me fait haluciner ce truc, dumper le txt d'un fichier est d'hab ce qu'il y a de plus simple, et là, avec les DLL on récupere tout ce qu'on veux, images, sons...etc sauf tu bête texte.
Si vis pacem para bellum
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#7

Message par bloodwolff »

Et c'est à ce moment que le loup sanguinaire arrive avec une solution! Nah je rigole j'ai même pas regarder :P
Compte skype : bloodwolfff
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#8

Message par Tlem »

Je ne sait pas si on doit considérer Zedna comme un loup sanguinaire, mais à première vue et d'après mon test, il à trouvé la solution. 8)
Il faut remplacer _ResourceGetAsString par cette fonction :
► Afficher le texte
Faudra que je pense à mettre le tutoriel à jour ... :roll:
Edit : C'est fait !!!

Edit2 : Rooohhhh, ca ne fonctionne plus. :cry:
Pourtant je l'ai lancé deux fois pour tester et par deux fois j'ai bien vu le texte ... :?
Et là, je l'ai relancé juste pour voir et paf ... l'erreur est de retour. snif

Edit3 : Bon, je savais que j'étais pas fou. :mrgreen:
En fait, j'avais utilisé une ancienne version de resource_au3 et puis après, voulant faire les choses bien, j'ai récupéré l'archise du site US et mis à jour avec. Grrrrr
Attendons de voir ce que Zedna dira. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#9

Message par zeshrek »

Oh hoooooo....
m'en vais tester ca moi !
(et ej vais en profiter pôur aller voir ce que m'a dit zedna sur le fofo us)
Si vis pacem para bellum
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2104
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#10

Message par TommyDDR »

@Tlem : loup = wolf, sanguinaire = blood
-> Loup sanguinaire = bloodwolff
Je pense qu'il parlait de lui même :)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] lire une ressource TXT dans une DLL

#11

Message par zeshrek »

Apres moult tests et vérification, je confirme que... ca marche pas.
En fait c'est pas _ResourceGetAsString qui pose problème mais _ResourceGet

J'ai donc remplacé le _ResourceGet d'origine par celui que tu as mis sur le fofo US, et Ô Miracle ! ca marche !
Je suis bluffé !
J'en profite pour le mettre ici :
► Afficher le texte
Maintenant, je vais me triturer les boyaux de la tete pour voir d'ou venait le pb.
En tout cas bravo Boss, c'est pas pour rien que c'est toi le chef !
Si vis pacem para bellum
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] lire une ressource TXT dans une DLL

#12

Message par Tlem »

@TommyDDR
Oui j'avais bien compris. :lol:
zeshrek a écrit :c'est pas pour rien que c'est toi le chef !
Grrrrr

@zeshrek
Je vais mettre à jour l'UDF complet dans le sujet qui lui est attribué dans le forum tutoriel, donc inutile de répéter la fonction ici.
J'attend seulement de voir ce que zedna va dire à propos de l'utilisation qu'il a fait de _WinAPI au lieu des DllCall car ce sont elles qui foutent le bordel. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [R] lire une ressource TXT dans une DLL

#13

Message par zeshrek »

Tlem a écrit :
zeshrek a écrit :c'est pas pour rien que c'est toi le chef !
Grrrrr
Heuuuu... tu es sur que tu veux grogner apres un ogre ?
Tlem a écrit :Je vais mettre à jour l'UDF complet dans le sujet qui lui est attribué dans le forum tutoriel, donc inutile de répéter la fonction ici.
J'attend seulement de voir ce que zedna va dire à propos de l'utilisation qu'il a fait de _WinAPI au lieu des DllCall car ce sont elles qui foutent le bordel. :mrgreen:
Tu as lu le post de Rover ?
Je suis pas sur d'avoir tout compris, alors en attendant que ca soit mis a jour, je vais utiliser ta solution (même si selon rover y a un bug inside)

N'empeche je pensais pas avoir mis le doigt sur un bug pareil, surtout que bon, lire du txt dans une dll je pensais pas etre le premier a m'y aventurer !
Si vis pacem para bellum
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] lire une ressource TXT dans une DLL

#14

Message par Tlem »

J'ai essayé sa solution et à première vue, ça fonctionne impeccable.
Pas d'augmentation incohérente de la mémoire et fonctionne avec la DLL.
J'ai testé l'exemple de zedna avec cette mise à jour et c'est ok.
Je vais la mettre à jour de suite ici.

Essaie de la tester à fond. Si zedna fait une autre mise à jour de son sujet, j'en ferais de même. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [R] lire une ressource TXT dans une DLL

#15

Message par zeshrek »

Bon, j'ai pas testé 'a fond' mais j'ai validé que ca fonctionne parfait pour ce que je veux en faire, cad icones + texte. Comme les images fonctionnaient déjà et le wave aussi, a mon humble avis c'est au point.
De toutes facon, effectivement wait & see sur ce que dira Zedna
Si vis pacem para bellum
Répondre