UTILISATION DE RESSOURCES EXTERNES
Il est courant de
joindre un fichier de ressources (.res) à une application VB.
Des fonctions comme : LoadResString, LoadResPicture
ou LoadResData permettent de récupérer du
texte, des images ou des données binaires depuis cette ressource qui, après
compilation, est intégrée au fichier exécutable.
Mais il peut être intéressant, depuis une application compilée, d'aller
chercher des données contenues dans des fichiers de ressources externes. Un
exemple typique est la localisation d'application (utilisation de la langue de
son choix).
Microsoft donne un exemple et des conseils en VB où toutes les langues sont
dans le même fichier de ressource, ce qui agrandit inutilement la taille de
l'exécutable, et alourdit l'ensemble. Il est préférable de charger en
mémoire les ressources seulement si on en a besoin. Si une appli est traduite
en 5 langues, on ne chargera que la ressource de la langue choisie.
La lecture des
ressources provenant d'un fichier externe impose l'utilisation des APIs. Et les
APIs ne permettent pas d'ouvrir un fichier .res. Les ressources devront donc
être placées dans une .dll. Cette .dll n'a pas d'autre utilité que celle
d'être un "réservoir de données". un bon exemple d'une telle .dll
est le fichier "moricons.dll" de
W98 ou W2000 qui contient une bibliothèque d'icônes.
Pour écrire des données dans un tel fichier, il faut disposer d'un éditeur de
ressource comme Visual Studio.
Ce fichier, bien qu'ayant une structure de dll, peut avoir n'importe quelle
extension, par exemple .loc qui est couramment utilisée dans des applications C
ou C++.
Vous pouvez télécharger ici le fichier VIDE.LOC
(1 Ko) qu'il suffit d'éditer et de remplir avec Visual Studio.
Exemple : |
Dans cet exemple
très simple, il faut télécharger 3 fichiers de ressources (1 Ko chacun) :
Fr.loc, Eng.loc, Esp.loc.
Ci-dessous, le contenu de Fr.loc. Les 2 autres ont les mêmes textes en anglais
et espagnol.
Créez un nouveau
projet avec un formulaire. Placez-y 3 boutons nommés respectivement CmdFr,
CmdEng, CmdEsp.
Placez aussi 2 labels nommés Label1 et Label2.
Recopiez le code suivant dans le code du formulaire.
Enfin, placez les 3 fichiers de ressource dans le répertoire de l'application.
Si vous préférez, vous pouvez télécharger l'appli entière ici (8 Ko) : ExtRes.zip
Déclarations : |
Option Explicit
Private Const LOAD_LIBRARY_AS_DATAFILE = &H2
Private Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" _
(ByVal lpLibFileName As String, ByVal hFile As Long, _
ByVal dwFlags As Long) As Long
' Pour récupérer les textes
Private Declare Function LoadString Lib "user32" Alias "LoadStringA" _
(ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, _
ByVal nBufferMax As Long) As Long
' Pour récupérer des données binaires (non utile dans cet exemple)
' Private Declare Function FindResource Lib "kernel32" Alias "FindResourceA" _
(ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As String) As Long
' Private Declare Function LoadResource Lib "kernel32" _
(ByVal hInstance As Long, ByVal hResInfo As Long) As Long
' Pour récupérer un menu de ressource (non utile dans cet exemple)
' Private Declare Function LoadMenu Lib "user32" Alias "LoadMenuA" _
(ByVal hInstance As Long, ByVal lpString As String) As Long
Dim ResHandle As Long ' (Handle du fichier de ressource à ouvrir)
Code : |
Private Sub CmdFr_Click()
ResHandle = LoadLibraryEx(App.Path & "\Fr.loc" & Chr(0), 0&, LOAD_LIBRARY_AS_DATAFILE)
Label1 = LoadResStringP(1)
Label2 = LoadResStringP(2)
End Sub
Private Sub CmdEng_Click()
ResHandle = LoadLibraryEx(App.Path & "\Eng.loc" & Chr(0), 0&, LOAD_LIBRARY_AS_DATAFILE)
Label1 = LoadResStringP(1)
Label2 = LoadResStringP(2)
End Sub
Private Sub CmdEsp_Click()
ResHandle = LoadLibraryEx(App.Path & "\Esp.loc" & Chr(0), 0&, LOAD_LIBRARY_AS_DATAFILE)
Label1 = LoadResStringP(1)
Label2 = LoadResStringP(2)
End Sub
Private Function LoadResStringP(ResID As Integer) As String
' Cette fonction remplace LoadResString de VB
Dim BufStr As String * 50, TextLen As Long
TextLen = LoadString(ResHandle, CLng(ResID), BufStr, 50)
LoadResStringP = Left(BufStr, TextLen)
End Function