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

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 :)
 
 [:zjk]


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)
Reply

Marsh Posté le 21-11-2002 à 10:51:10   

Reply

Marsh Posté le 21-11-2002 à 11:01:23    

:)


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed