Frage

Ich versuche, eine DLL dynamisch über LoadLibrary() zu laden, was funktioniert, aber ich kann nicht dann die Adresse der Funktion in der DLL erhalten, dass ich auf Anruf bin versucht.

DLL-Funktion: (in CPP-Datei)

_declspec(dllexport) void MyDllFunc()
{
    printf("Hello from DLL");
}

Telefonvorwahl:

typedef void (*MyDllFuncPtr)();

int _tmain(int argc, _TCHAR* argv[])
{

    HINSTANCE LoadMe;
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll";

    LoadMe = LoadLibrary(str);

    if(LoadMe != 0)
        printf("Successfully Loaded!\r\n");
    else
        printf("Loading Failed \r\n" );


    MyDllFuncPtr func;

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc");

    if (func != NULL)
        func();

    FreeLibrary(LoadMe);

}

func kehrt NULL !!!

Was mache ich falsch?

Dies ist ein Win32-Konsolenprojekt.

War es hilfreich?

Lösung

Schreiben

extern "C" _declspec(dllexport) void MyDllFunc()

Andere Tipps

Sie tun es falsch. __declspec (dllexport) Paare mit __declspec (dllimport).

#1: In the DLL, declare the function's prototype with __declspec(dllexport).
#2: In the .exe, declare the function's prototype with __declspec(dllimport).
#3: Compile the .dll. You should also get a .lib file.
#4: Link the .exe with the .lib, and compile.
#5: Success.

Wenn Sie __declspec (dllimport) und __declspec (dllexport) verwenden, müssen Sie nie die WinAPI Funktionen zum Laden einer DLL berühren. Dllimport / Export funktioniert das alles für Sie. Darüber hinaus müssen Sie nicht auf extern C nichts.

Ihre exportierten Funktionen Name werden Dekoriert bei der Verwendung von __ declspec (dllexport) , können Sie reduzieren die Dekoration mit extern "C" , wird es jedoch nicht vollständig auf das Symbol schmucklos, zu tun, dass Sie ein def Datei und es als benannte Symbol exportieren, was Sie zu verwenden GetProcAddress müssen die verstümmelten / dekorierten Symbolnamen verwendet, die kurz ist, wenn extern "C" exportiert werden.

Wenn die DLL als C ++ DLL gebaut wird, wird es die Funktionen Namen ändern. Dies ist Compiler abhängig. Ich würde stark machen es zu einer C-DLL (C-Schnittstelle + C ++ Eingeweide) empfehlen. Ich habe nicht ein Beispiel an mich habe gerade jetzt, aber Sie sollten in der Lage sein, etwas auf dem Netz zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top