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?

Était-ce utile?

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.

Les éléments suivants sont les 5 étapes nécessaires:

  1. déclarer le pointeur de fonction
  2. Charger la bibliothèque
  3. Adresse de procédure
  4. l'assigner à fonctionner pointeur
  5. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top