Comment récupérer une resource custom associée à un projet VB
Comment récupérer une resource custom associée à un projet VB - VB/VBA/VBS - Programmation
MarshPosté le 21-11-2002 à 10:51:10
J'ai trouvé comment récupérer une resource custom associée à un projet VB
Histoire de planter le décor: je voulais flanquer brutalement un fichier TXT dans un exécutable, lequel TXT contient des messages d'erreur, ce qui me permet de ne pas avoir de crasses à côté du fichier exécutable lorsque je fais la livraison de mon tool préféré.
En gros j'ajoute un fichier quelconque comme custom resource. Il sera donc dans le noeud CUSTOM sous l'ID de votre choix (par défaut: 101). Ensuite, je le charge grâce à la syntaxe suivante:
strText = LoadResData(101, "CUSTOM" )
Ouais il fallait bêtement spécifier "CUSTOM" et non pas une constante brolique VB comme j'avais essayé au départ.
Dans le cas présent j'ai donc inclu un fichier texte. Le glitch, c'est que c'est de l'ANSI et que VB travaille uniquement avec des strings en unicode (1 char = 2 bytes physiques), et comme les custom resources sont prises comme du binary, ben ça fait mal et je me retrouve avec un truc inutilisable. Si le fichier texte est unicode à la base, alors pas de problème, faut juste virer le premier caractère (unicode donc 2 bytes physiques) qui sert de header et le tour est joué, donc j'ai:
Mais Crimson Editor, qui est au passage un excellent éditeur texte freeware, n'aime pas l'unicode (du moins dans sa version freeware puisque l'option est désactivée). Et comme il n'y a pas d'option explicite dans notepad pour créer un fichier unicode, il a fallu que je pousse un peu plus loin l'investigation.
Grâce à l'excellente API Win32 CopyMemory, j'ai trouvé mon bonheur
Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" (Destination As Any, _ Source As Any, _ ByVal Length As Long)
Private Sub Form_Load() Dim vData() As Byte Dim strText As String
' Lecture de la resource vers un tableau de bytes vData = LoadResData("HMDCM", "CUSTOM" ) ' Réservation de l'espace nécessaire pour recevoir ' la resource sous forme de string (obligatoire ' avec CopyMemory strText = Space$(UBound(vData) + 1)
' Le Byval devant strText force une conversion Unicode ' vers ANSI du contenu de la variable, permettant ainsi ' un transfert correct des données (CopyMemory travaille ' sur une base binaire) Call CopyMemory(ByVal strText, vData(0), Len(strText))
' La string est remplie, affichage à l'écran txtRes.Text = strText End Sub
Et ma ressource texte apparaît dans mon champ texte.
Ca peut paraître idiot pour certains mais avoir trouvé le truc me met de bonne humeur pour le reste de la journée
Message édité par drasche le 21-05-2003 à 14:44:03
--------------- Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Marsh Posté le 21-11-2002 à 10:51:10
J'ai trouvé comment récupérer une resource custom associée à un projet VB
Histoire de planter le décor: je voulais flanquer brutalement un fichier TXT dans un exécutable, lequel TXT contient des messages d'erreur, ce qui me permet de ne pas avoir de crasses à côté du fichier exécutable lorsque je fais la livraison de mon tool préféré.
En gros j'ajoute un fichier quelconque comme custom resource. Il sera donc dans le noeud CUSTOM sous l'ID de votre choix (par défaut: 101). Ensuite, je le charge grâce à la syntaxe suivante:
strText = LoadResData(101, "CUSTOM" )
Ouais il fallait bêtement spécifier "CUSTOM" et non pas une constante brolique VB comme j'avais essayé au départ.
Dans le cas présent j'ai donc inclu un fichier texte. Le glitch, c'est que c'est de l'ANSI et que VB travaille uniquement avec des strings en unicode (1 char = 2 bytes physiques), et comme les custom resources sont prises comme du binary, ben ça fait mal et je me retrouve avec un truc inutilisable. Si le fichier texte est unicode à la base, alors pas de problème, faut juste virer le premier caractère (unicode donc 2 bytes physiques) qui sert de header et le tour est joué, donc j'ai:
strText = LoadResData(101, "CUSTOM" )
txtRes.Text = Mid$(strText, 2)
dans mon exemple.
Mais Crimson Editor, qui est au passage un excellent éditeur texte freeware, n'aime pas l'unicode (du moins dans sa version freeware puisque l'option est désactivée). Et comme il n'y a pas d'option explicite dans notepad pour créer un fichier unicode, il a fallu que je pousse un peu plus loin l'investigation.
Grâce à l'excellente API Win32 CopyMemory, j'ai trouvé mon bonheur
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory"
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
Private Sub Form_Load()
Dim vData() As Byte
Dim strText As String
' Lecture de la resource vers un tableau de bytes
vData = LoadResData("HMDCM", "CUSTOM" )
' Réservation de l'espace nécessaire pour recevoir
' la resource sous forme de string (obligatoire
' avec CopyMemory
strText = Space$(UBound(vData) + 1)
' Le Byval devant strText force une conversion Unicode
' vers ANSI du contenu de la variable, permettant ainsi
' un transfert correct des données (CopyMemory travaille
' sur une base binaire)
Call CopyMemory(ByVal strText, vData(0), Len(strText))
' La string est remplie, affichage à l'écran
txtRes.Text = strText
End Sub
Et ma ressource texte apparaît dans mon champ texte.
Ca peut paraître idiot pour certains mais avoir trouvé le truc me met de bonne humeur pour le reste de la journée
Message édité par drasche le 21-05-2003 à 14:44:03
---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)