web-dev-qa-db-de.com

Aufruf von Funktionen in einer DLL aus C ++

Ich habe eine Lösung in VS 2008 mit 2 Projekten darin. Eine ist eine DLL, die in C++ geschrieben wurde, und die andere ist eine einfache C++ - Konsolenanwendung, die aus einem leeren Projekt erstellt wurde. Ich möchte wissen, wie man die Funktionen in der DLL aus der Anwendung heraus aufruft.

Angenommen, ich beginne mit einem leeren C++ - Projekt und möchte eine Funktion namens int IsolatedFunction(int someParam) aufrufen.

Wie nenne ich es?

39
QueueHammer

Es gibt viele Möglichkeiten, dies zu tun, aber ich denke, eine der einfachsten Möglichkeiten besteht darin, die Anwendung zum Zeitpunkt der Verknüpfung mit der DLL zu verknüpfen und dann mit einer Definitionsdatei die Symbole zu definieren aus der DLL exportiert werden.

CAVEAT: Der Definitionsdateiansatz funktioniert am besten für undekorierte Symbolnamen. Wenn Sie dekorierte Symbole exportieren möchten, ist es wahrscheinlich besser, NOT USE den Ansatz der Definitionsdatei zu verwenden.

Hier ist ein einfaches Beispiel, wie das gemacht wird.

Schritt 1: Definieren Sie die Funktion in der Datei export.h.

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

Schritt 2: Definieren Sie die Funktion in der Datei export.cpp.

#include <windows.h>

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

Schritt 3: Definieren Sie die Funktion als Export in der export.def Definitionsdatei.

EXPORTS    IsolatedFunction          @1

Schritt 4: Erstellen Sie ein DLL - Projekt und fügen Sie die Dateien export.cpp und export.def zu diesem Projekt hinzu . Wenn Sie dieses Projekt erstellen, werden eine export.dll und eine export.lib Datei erstellt.

Die folgenden beiden Schritte verknüpfen sich zum Zeitpunkt der Verknüpfung mit DLL. Wenn Sie die Einstiegspunkte nicht zur Verknüpfungszeit definieren möchten, ignorieren Sie die nächsten beiden Schritte und laden Sie den Funktionseinstiegspunkt zur Laufzeit mit LoadLibrary und GetProcAddress.

Schritt 5: Erstellen Sie ein Test Anwendungsprojekt, um die DLL zu verwenden, indem Sie die Datei export.lib zum Projekt hinzufügen. Kopieren Sie die Datei export.dll an denselben Speicherort wie die ausführbare Datei Test der Konsole.

Schritt 6: Rufen Sie die Funktion IsolatedFunction in der Testanwendung wie unten gezeigt auf.

#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

Kann auch Funktionen aus der DLL exportieren und aus der EXE importieren. Dies ist zunächst etwas komplizierter, ist aber am Ende viel einfacher als das Aufrufen von LoadLibrary/GetProcAddress. Siehe MSDN .

Beim Erstellen des Projekts mit dem VS-Assistenten befindet sich in der DLL ein Kontrollkästchen, mit dem Sie Funktionen exportieren können.

In der exe-Anwendung müssen Sie dann nur noch einen Header aus der dll mit den richtigen Definitionen einfügen und das dll-Projekt als Abhängigkeit zur exe-Anwendung hinzufügen.

Aktivieren Sie diese andere Frage, wenn Sie diesen Punkt näher untersuchen möchten Exportieren von Funktionen aus einer DLL mit dllexport .

9
Ismael

Sie können entweder die Route LoadLibrary/GetProcAddress (wie Harper in seiner Antwort erwähnt hat, hier ist der Link zum MSDN-Beispiel für dynamische Laufzeitverknüpfung erneut) oder Sie Sie können Ihre Konsolenanwendung mit der aus dem DLL) -Projekt erstellten .lib verknüpfen und die Datei hea.h mit der Deklaration Ihrer Funktion einschließen (wie in beschrieben). Ladezeit Dynamische Verknüpfung MSDN-Beispiel )

In beiden Fällen müssen Sie sicherstellen, dass Ihre DLL die aufzurufende Funktion ordnungsgemäß exportiert. Der einfachste Weg, dies zu tun, ist die Verwendung von __declspec (dllexport) in der Funktionsdeklaration (wie in gezeigt) das Erstellen eines einfachen Dynamic Link Library-MSDN-Beispiels ), obwohl Sie dies auch über die entsprechende .def-Datei in Ihrer DLL Projekt.

Weitere Informationen zum Thema DLLs finden Sie im Thema MSDN About Dynamic-Link Libraries .

6
Franci Penov

Die folgenden 5 Schritte sind erforderlich:

  1. deklarieren Sie den Funktionszeiger
  2. Laden Sie die Bibliothek
  3. Holen Sie sich die Verfahrensadresse
  4. weisen Sie es dem Funktionszeiger zu
  5. rufen Sie die Funktion mit dem Funktionszeiger auf

Sie finden die schrittweise Anleitung für VC++ IDE Screenshot unter http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html

Hier ist das Code-Snippet:

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;
}

Wenn die DLL erstellt wurde, wird normalerweise automatisch eine Import-Bibliothek erstellt, und Sie sollten die mit Ihrem Programm verknüpfte Bibliothek zusammen mit den Header-Dateien verwenden, um sie aufzurufen. Wenn nicht, können Sie Windows-Funktionen wie - manuell aufrufen. LoadLibrary und GetProcAddress , damit es funktioniert.

0
Tim Matthews

Angenommen, Sie sprechen über das dynamische Laden von DLLs zur Laufzeit und suchen nach LoadLibrary und GetProAddress. Es gibt ein Beispiel für MSDN .

0
Harper Shelby