Fonctions d'appel dans une DLL à partir de C++
j'ai une solution en VS 2008 avec 2 projets en it. L'une est une DLL écrite en C++ et l'autre est une simple application de console C++ créée à partir d'un projet vierge. Je voudrais savoir comment appeler les fonctions dans la DLL de l'application.
suppose que je commence avec un projet c++ vierge et que je veux appeler une fonction appelée int IsolatedFunction(int someParam)
comment je l'appelle?
6 réponses
il y a plusieurs façons de le faire, mais je pense que l'une des options les plus faciles est de lier l'application à la DLL au moment du lien et ensuite d'utiliser un fichier de définition pour définir les symboles à exporter de la DLL.
mise en garde: l'approche fondée sur les fichiers de définition fonctionne mieux que non décorée noms des symboles. Si vous voulez exporter des symboles décorés alors il est probablement préférable de ne pas utiliser le fichier de définition de l'approche.
Voici un exemple simple sur la façon dont cela est fait.
Étape 1: définir la fonction dans le exportation.h "151960920 de fichier".
int WINAPI IsolatedFunction(const char *title, const char *test);
Étape 2: définir la fonction dans le exportation.rpc "151960920 de 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 un l'exportation dans le à l'exportation.def fichier de définition.
EXPORTS IsolatedFunction @1
Étape 4: créer un projet DLL et ajouter le exportation.CPP et export.def dossiers à ce projet. La construction de ce projet créera une exportation .dll et une export.lib fichier.
les deux étapes suivantes servent de lien vers le DLL à l'heure du lien. Si vous n'avez pas vous voulez définir les points d'entrée à l'heure du lien, ignorez les deux prochaines étapes et utilisez le LoadLibrary et Getacadress pour charger le point d'entrée de la fonction à l'exécution.
Étape 5: créer un Test projet d'application pour utiliser la dll en ajoutant le exportation.lib dossier au projet. Copier l'exportation .dll fichier au même endroit que l'exécutable de la console Test .
Étape 6: Appel 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;
}
peut également exporter des fonctions de dll et importer de l'exe, il est plus délicat au début, mais à la fin est beaucoup plus facile que D'appeler LoadLibrary/Getprocadress. Voir MSDN .
lors de la création du projet avec L'Assistant VS il y a une case à cocher dans la dll qui vous permet d'exporter des fonctions.
ensuite, dans l'application exe vous n'avez qu'à #inclure un en-tête de la dll avec les définitions appropriées, et ajouter la dll projet en tant que dépendance à l'application exe.
Vérifiez cette autre question si vous voulez enquêter sur ce point plus loin fonctions D'exportation d'une DLL avec dllexport .
vous pouvez soit suivre la route LoadLibrary/GetProcAddress (comme Harper L'a mentionné dans sa réponse, voici le lien vers la dynamique run-time reliant MSDN sample encore une fois) ou vous pouvez relier votre application console à la .lib produit à partir du projet DLL et inclure le hea.h fichier avec la déclaration de votre fonction (tel que décrit dans la liaison dynamique Charge-Temps MSDN échantillon )
Dans les deux cas, vous devez vous assurer que votre DLL exporte la fonction que vous voulez appeler correctement. La façon la plus simple de le faire est d'utiliser __declspec(dllexport) sur la déclaration de fonction (comme indiqué dans la création d'une simple dynamic-link library MSDN sample ), bien que vous puissiez le faire aussi à travers la correspondante .fichier def dans votre projet DLL.
pour plus d'informations sur le thème des DLLs, vous devez naviguer à travers le MSDN à propos de Dynamic-Link Libraries thème.
voici Les 5 étapes nécessaires:
- déclare le pointeur de fonction
- Charger la bibliothèque
- obtenir l'adresse de la procédure
- l'affecter à la fonction de pointeur
- appeler la fonction en utilisant le pointeur de fonction
vous pouvez trouver l'étape par étape VC++ écran IDE tourné à 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;
}
présumant que vous parlez de chargement dynamique de DLLs, vous cherchez LoadLibrary et GetProAddress. Il y a un exemple sur MSDN .
lorsque la DLL a été créé une lib importation est généralement automatiquement créé et vous devez utiliser celui lié à votre programme avec les fichiers d'en-tête pour l'appeler, mais si ce n'est pas le cas, vous pouvez appeler manuellement les fonctions de windows comme LoadLibrary et Getrocaddress pour le faire fonctionner.