Utilisation des DLL dans RAD Studio (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Création de packages et de DLL


RAD Studio prend en charge les bibliothèques de liaison dynamique pour Windows (fichiers DLL) et macOS (fichiers dylib).

Pour créer une bibliothèque dynamique, sélectionnez Fichier > Nouveau > Autre. Depuis le noeud Projets C++Builder, sélectionnez Bibliothèque de liaison dynamique.

Le code suivant est automatiquement généré dans le fichier principal du nouveau projet :

//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you

#pragma hdrstop
#pragma argsused

extern "C" int _libmain(unsigned long reason)
{
	return 1;
}

La fonction _libmain est le point d'entrée dans la bibliothèque dynamique. Lors du chargement de la bibliothèque dynamique, la fonction _libmain est appelée. Cette fonction contient généralement le code d'initialisation.

Exportation de fonctions

Les fonctions définies dans la bibliothèque dynamique doivent être exportées afin d'être visibles à l'extérieur de la bibliothèque dynamique. Voici la syntaxe pour exporter des fonctions :

extern "C" __declspec(dllexport) <return_type> <function_name>(<function_parameters>);

Importation de fonctions

Pour utiliser des fonctions définies dans une bibliothèque dynamique, vous devez déclarer la fonction en tant que fonction importée, charger la bibliothèque dans laquelle la fonction est définie puis accéder à la fonction. Voici la syntaxe pour importer des fonctions :

extern "C" __declspec(dllimport) <return_type> <function_name>(<function_parameters>);

Remarque : Le prototype de la fonction importée doit correspondre à la définition de la fonction à l'intérieur de la bibliothèque dynamique.

Utilisation d'une bibliothèque de liaison dynamique

Afin d'invoquer les fonctions exportées par une bibliothèque de liaison dynamique, la bibliothèque doit être chargée en mémoire et la fonction doit être déclarée en tant que fonction importée. Il existe deux manières de charger la bibliothèque : statiquement (à la liaison) et dynamiquement (à l'exécution).

Chargement statique de la bibliothèque

Lorsque vous ciblez Win32 et Win64, vous pouvez ajouter la bibliothèque d'importation à votre projet à partir du code, en insérant la directive pragma dans un fichier source du projet :

#pragma comment(lib, "TestDLL")
Remarque : Par défaut, le nom du fichier n'inclut pas l'extension.


Lorsque vous ciblez Win32, la procédure requiert la liaison de la bibliothèque de liaison dynamique via une bibliothèque d'importation d'extension .lib. Lorsque vous ciblez Win64, la procédure requiert la liaison de la bibliothèque de liaison dynamique via une bibliothèque d'importation d'extension .a. La bibliothèque d'importation est automatiquement générée par le projet de bibliothèque de liaison dynamique.

Si vous ciblez uniquement WIN32 ou uniquement WIN64, au lieu d'ajouter pragma, vous devez ajouter la bibliothèque d'importation à votre projet en cliquant avec le bouton droit dans le Gestionnaire de projets, et en sélectionnant Ajouter.... Dès que la bibliothèque d'importation a été ajoutée à votre projet, assurez-vous que les fonctions ont été importées (utilisez la syntaxe d'importation décrite ci-dessus). Ces fonctions peuvent maintenant être utilisées dans votre projet.

Remarque : Assurez-vous que l'option Générer la bibliothèque d'importation du projet de bibliothèque de liaison dynamique est définie sur True afin que la bibliothèque d'importation (fichier .lib) soit générée lors de la construction du projet. Pour de plus amples informations, voir Lieur C++.

Chargement dynamique de la bibliothèque

Dès que les fonctions importées sont déclarées, la bibliothèque dynamique doit être chargée à l'exécution. Cette opération est réalisée en utilisant la fonction LoadLibrary. Lorsque la bibliothèque est chargée en mémoire, utilisez la fonction GetProcAddress pour récupérer un pointeur vers une certaine fonction.

Voici un exemple complet de l'utilisation des bibliothèques dynamiques dans les applications C++Builder : Tutoriel : Utilisation des bibliothèques de liaison dynamique dans les applications C++Builder.

Voir aussi