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

Retour à l'accueil