Appel de fonctions dans une DLL de C ++
-
22-08-2019 - |
Question
J'ai une solution dans VS 2008 avec 2 projets en elle. L'un est une DLL écrite en C ++ et l'autre est une simple application console C ++ créé à partir d'un projet vide. Je voudrais savoir comment appeler les fonctions dans la DLL de l'application.
On suppose Je commence avec un C ++ projet et blanc que je veux appeler une fonction appelée int IsolatedFunction(int someParam)
Comment puis-je l'appelle?
La solution
Il y a plusieurs façons de le faire, mais je pense que l'une des options les plus simples est de lier l'application à la DLL au moment de la liaison, puis utilisez fichier de définition pour définir les symboles à exporter à partir la DLL.
OPPOSITION: L'approche de fichier de définition fonctionne pour bests undecorated noms de symboles. Si vous voulez alors il est probablement préférable d'exporter des symboles décorés PAS UTILISER l'approche de fichier de définition.
Voici un exemple simple sur la façon dont cela est fait.
Étape 1:. Définir la fonction dans le export.h fichier
int WINAPI IsolatedFunction(const char *title, const char *test);
Étape 2:. Définir la fonction dans le export.cpp fichier
#include <windows.h>
int WINAPI IsolatedFunction(const char *title, const char *test)
{
MessageBox(0, title, test, MB_OK);
return 1;
}
Étape 3:. Définir la fonction comme une exportation dans le export.def fichier défintion
EXPORTS IsolatedFunction @1
Étape 4: Créer un projet DLL et ajoutez les export.cpp et export.def fichiers à ce projet. La construction de ce projet va créer un export.dll et un export.lib fichier.
Les deux étapes suivantes contiennent un lien vers la DLL au moment de la liaison. Si vous ne souhaitez pas définir les points d'entrée au moment de la liaison, ignorez les deux étapes suivantes et utiliser le LoadLibrary et GetProcAddress pour charger le point d'entrée de la fonction lors de l'exécution.
Étape 5: Créer un projet d'application test pour utiliser la dll en ajoutant export.lib fichier au projet. Copiez le export.dll fichier à ths même endroit que le test exécutable console.
Étape 6:. Appelez le IsolatedFunction fonction dans l'application de test comme indiqué ci-dessous
#include "stdafx.h"
// get the function prototype of the imported function
#include "../export/export.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// call the imported function found in the dll
int result = IsolatedFunction("hello", "world");
return 0;
}
Autres conseils
Peut exporter également des fonctions de dll et l'importation de l'exe, il est plus difficile au début mais à la fin est beaucoup plus facile que d'appeler LoadLibrary / GetProcAddress. Voir MSDN .
Lors de la création du projet avec l'assistant VS, il y a une case à cocher dans la dll que vous permettent d'exporter des fonctions.
Ensuite, dans l'application exe vous suffit de #inclure un en-tête de la dll avec les définitions appropriées et ajouter le projet dll comme une dépendance à l'application exe.
Cochez cette autre question si vous voulez enquêter sur ce point plus Exportation des fonctions de une DLL avec dllexport.
Vous pouvez emprunter la voie LoadLibrary / GetProcAddress (comme Harper mentionné dans sa réponse, voici lien vers la page )
Dans les deux cas, vous devez vous assurer que votre DLL exporte la fonction que vous voulez appeler correctement. La meilleure façon de le faire est à l'aide __declspec (dllexport) sur la déclaration de fonction (comme le montre la création d'un MSDN sur le sujet de bibliothèques de liens dynamiques.
Les éléments suivants sont les 5 étapes nécessaires:
- déclarer le pointeur de fonction
- Charger la bibliothèque
- Adresse de procédure
- l'assigner à fonctionner pointeur
- appeler la fonction à l'aide de la fonction pointeur
Vous pouvez trouver l'étape par étape capture d'écran VC ++ IDE http: //www.softwareandfinance. com / Visual_CPP / DLLDynamicBinding.html
Voici l'extrait de code:
int main()
{
/***
__declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
***/
typedef bool (*GW)(char *buf, int len);
HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");
char buf[128];
if(GetWelcomeMessage(buf, 128) == true)
std::cout << buf;
return 0;
}
En supposant que vous parlez chargement pendant l'exécution dynamique de DLL, vous cherchez LoadLibrary et GetProAddress. Il y a un exemple sur MSDN .
Lorsque la DLL a été créé un lib d'importation est généralement créé et vous automatiquement doit utiliser ce lié à votre programme ainsi que les fichiers d'en-tête pour l'appeler mais sinon vous pouvez appeler manuellement les fenêtres des fonctions comme LoadLibrary et GetProcAddress pour le faire fonctionner.