web-dev-qa-db-fra.com

Appeler des fonctions dans un DLL depuis C ++

J'ai une solution dans VS 2008 avec 2 projets dedans. L'un est un DLL écrit en C++ et l'autre est une simple application console C++ créée à partir d'un projet vierge. Je voudrais savoir comment appeler les fonctions dans le DLL depuis l'application.

Supposons que je commence avec un projet C++ vierge et que je souhaite appeler une fonction appelée int IsolatedFunction(int someParam)

Comment dois-je l'appeler?

39
QueueHammer

Il existe de nombreuses façons de le faire, mais je pense que l'une des options les plus simples consiste à lier l'application au DLL au moment du lien, puis à utiliser un fichier de définition pour définir les symboles à exporter depuis la DLL.

CAVEAT: L'approche du fichier de définition fonctionne mieux pour non décoré noms de symboles. Si vous souhaitez exporter des symboles décorés, il est probablement préférable de NE PAS UTILISER l'approche du fichier de définition.

Voici un exemple simple sur la façon de procéder.

Étape 1: Définissez la fonction dans le fichier export.h.

int WINAPI IsolatedFunction(const char *title, const char *test);

Étape 2: Définissez la fonction dans le fichier export.cpp.

#include <windows.h>

int WINAPI IsolatedFunction(const char *title, const char *test)
{
    MessageBox(0, title, test, MB_OK);
    return 1;
}

Étape 3: Définissez la fonction comme exportation dans le fichier de définition export.def.

EXPORTS    IsolatedFunction          @1

Étape 4: Créez un projet DLL et ajoutez le export.cpp et export.def = fichiers vers ce projet. La construction de ce projet créera un fichier export.dll et un fichier export.lib.

Les deux étapes suivantes sont liées à DLL au moment du lien. Si vous ne voulez pas définir les points d'entrée au moment du lien, ignorez les deux étapes suivantes et utilisez LoadLibrary et GetProcAddress pour charger le point d'entrée de la fonction lors de l'exécution.

Étape 5: Créez un projet d'application Test pour utiliser la DLL en ajoutant le fichier export.lib au projet. Copiez le fichier export.dll dans le même emplacement que l'exécutable de la console Test.

Étape 6: Appelez la fonction IsolatedFunction à partir de 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;
}
20
jussij

Peut également exporter des fonctions à partir de la DLL et importer à partir de l'exe, c'est plus délicat au début, mais au final c'est beaucoup plus facile que d'appeler LoadLibrary/GetProcAddress. Voir MSDN .

Lors de la création du projet avec l'assistant VS, une case à cocher dans la DLL 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 le projet dll en tant que dépendance à l'application exe.

Cochez cette autre question si vous souhaitez approfondir ce point Exportation de fonctions à partir d'un DLL avec dllexport .

9
Ismael

Vous pouvez soit suivre la route LoadLibrary/GetProcAddress (comme Harper l'a mentionné dans sa réponse, voici à nouveau le lien vers exemple MSDN de liaison dynamique au moment de l'exécution ), soit vous pouvez lier votre application console à la .lib produite à partir de le projet DLL et incluez le fichier hea.h avec la déclaration de votre fonction (comme décrit dans le exemple MSDN de liaison dynamique au temps de chargement )

Dans les deux cas, vous devez vous assurer que votre DLL exporte la fonction que vous souhaitez appeler correctement. La façon la plus simple de le faire est d'utiliser __declspec (dllexport) dans la déclaration de fonction (comme indiqué dans la création d'un exemple MSDN de bibliothèque de liens dynamiques simples ), mais vous pouvez également le faire via le fichier .def correspondant dans votre projet DLL DLL.

Pour plus d'informations sur le sujet des DLL, vous devez parcourir la rubrique MSDN About Dynamic-Link Libraries .

6
Franci Penov

Voici les 5 étapes requises:

  1. déclarer le pointeur de fonction
  2. Charger la bibliothèque
  3. Obtenez l'adresse de la procédure
  4. l'assigner au pointeur de fonction
  5. appeler la fonction en utilisant le pointeur de fonction

Vous pouvez trouver l'étape par étape VC++ IDE sur 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;
}

Lorsque la DLL a été créée, une bibliothèque d'importation est généralement créée automatiquement et vous devez utiliser celle liée à votre programme avec les fichiers d'en-tête pour l'appeler, mais sinon, vous pouvez appeler manuellement des fonctions Windows comme - LoadLibrary et GetProcAddress pour le faire fonctionner.

0
Tim Matthews

En supposant que vous parlez du chargement dynamique des DLL lors de l'exécution, vous recherchez LoadLibrary et GetProAddress. Il y a un exemple sur MSDN .

0
Harper Shelby