Je comprends que je dois utiliser LoadLibrary (). Mais quelles autres étapes dois-je suivre pour utiliser un fichier tiers DLL?
J'ai simplement sauté dans C++ et c'est la seule partie que je ne reçois pas (en tant que programmeur Java). Je cherche simplement à utiliser un Qt Library et tesseract-ocr, mais le processus n’a aucun sens pour moi et il est si difficile à rechercher sur Google.
Comment puis-je informer le compilateur des fonctions que j'utilise? Devrait-il y avoir un fichier d'inclusion provenant du fournisseur tiers?
Comme tout le monde le dit, LoadLibrary est le moyen le plus difficile de le faire et n’est pratiquement jamais nécessaire.
La DLL aurait dû être accompagnée d'un fichier .lib pour la liaison et d'un ou plusieurs fichiers d'en-tête à #include dans vos sources. Les fichiers d'en-tête définiront les prototypes de classes et de fonctions que vous pouvez utiliser à partir de la DLL, vous en aurez besoin même si vous utilisez LoadLibrary.
Pour créer un lien avec la bibliothèque, vous devrez peut-être ajouter le fichier .lib à la configuration du projet sous Linker/Input/Additional Dependencies.
Pour incorporer des DLL tierces dans mon projet C++ de VS 2008, j'ai procédé comme suit (vous devriez pouvoir traduire en 2010, 2012, etc.) ...
J'ai mis les fichiers d'en-tête dans ma solution avec mes autres fichiers d'en-tête, apporté des modifications à mon code pour appeler les fonctions des DLL (sinon, pourquoi ferions-nous tout cela?). : ^) Ensuite, j'ai modifié la construction pour lier le code LIB à mon fichier EXE, pour copier les DLL en place et pour les nettoyer lorsque j'ai effectué un nettoyage - j'explique ces modifications ci-dessous.
Supposons que vous ayez deux DLL tierces, A.DLL et B.DLL, et que vous disposiez d'un fichier LIB stub pour chaque fichier (A.LIB et B.LIB) et de fichiers d'en-tête (A.H et B.H).
(Vous devrez apporter la prochaine série de modifications une fois pour chaque cible de génération source que vous utilisez (Debug, Release).)
Rendre votre fichier EXE dépendant des fichiers LIB
A.LIB B.LIB
$(SolutionDir)fodder
, vous le changez en $(SolutionDir)fodder;$(SolutionDir)lib
pour ajouter "lib".Forcer les DLL à être copiées dans le répertoire de sortie
XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y
Copy DLLs to Target Directory
No
. Cliquez sur OK
.Dites à VS de nettoyer les DLL lorsqu'il nettoie un dossier de sortie:
*.dll
à la fin de la liste et cliquez sur OK
.Voici deux manières d’utiliser un fichier DLL dans Windows:
Il existe une bibliothèque de stub (.lib) avec les fichiers d’en-tête associés. Lorsque vous liez votre fichier exécutable au fichier lib-file, il charge automatiquement le fichier DLL lors du démarrage du programme.
Chargement manuel du fichier DLL. C'est généralement ce que vous souhaitez faire si vous développez un système de plug-in comportant de nombreux fichiers DLL implémentant une interface commune. Cochez la documentation de LoadLibrary et GetProcAddress pour plus d'informations à ce sujet.
Pour Qt, je pense qu'il existe des en-têtes et une bibliothèque statique disponibles que vous pouvez inclure et lier dans votre projet.
Pour utiliser Qt avec des liens dynamiques, vous devez spécifier les fichiers lib
(généralement qtmaind.lib
, QtCored4.lib
et QtGuid4.lib
pour la configration "Debug") dansProperties » Linker » Input » Additional Dependencies
.
Vous devez également spécifiez le chemin où se trouvent les bibliothèques, à savoir dansProperties » Linker » General » Additional Library Directories
.
Et vous devez faire le .dll
s sont accessibles au moment de l’exécution, soit en les stockant dans le même dossier que votre .exe
ou dans un dossier qui est sur votre chemin.
Vous ne devez utiliser LoadLibrary que si vous souhaitez lier tardivement et résoudre uniquement les fonctions importées au moment de l'exécution. Le moyen le plus simple d’utiliser une tierce partie est de créer un lien avec un fichier .lib.
En réponse à votre modification:
Oui, l'API tierce doit être composée d'une dll et/ou d'une bibliothèque contenant les fichiers d'implémentation et d'en-tête qui déclarent les types requis. Vous devez connaître les définitions de type, quelle que soit la méthode utilisée - pour LoadLibrary, vous devez définir des pointeurs de fonction, de sorte que vous puissiez également écrire votre propre fichier d'en-tête à la place. Fondamentalement, vous ne devez utiliser LoadLibrary que si vous souhaitez une liaison tardive. Une raison valable pour cela serait si vous n'êtes pas sûr que la dll sera disponible sur le PC cible.
Si vous êtes supposé pouvoir l'utiliser, la bibliothèque tierce devrait avoir un fichier * .lib ainsi qu'un fichier * .dll. Vous devez simplement ajouter le fichier * .lib à la liste des fichiers d'entrée dans les options "Éditeur de liens" de votre projet.
Ce fichier * .lib n'est pas nécessairement une bibliothèque 'statique' (qui contient du code): à la place, un fichier * .lib peut être simplement un fichier reliant votre exécutable à la DLL.