LInker Fehler bei class __declspec(dllecport/import)



  • Hi, ich möchte eine Klasse, die in einer DLL ist in meiner Anwendung verwenden.
    Die DLL soll dabei ohne die lib gebunden werden, also über LoadLibrary.

    dll.h:

    #ifdef _DLLEXPORT
    #define CLASS_DECLSPEC    __declspec(dllexport)
    #else
    #define CLASS_DECLSPEC    __declspec(dllimport)
    #endif
    
    class CLASS_DECLSPEC cHallo
    {
    public:
    	cHallo();
    
    	static int test();
    
    	int Add(int a, int b);
    
    private:
    };
    

    dll.cpp:

    // DLLHalloWelt.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
    //
    
    #include "stdafx.h"
    #include "dll.h"
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
    
    int cHallo::test()
    {
    	//....
    }
    
    int cHallo::Add(int a, int b)
    {
    	return (a+b);
    }
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
    

    Nun die Anwendung app.cpp:

    #include <iostream>
    #include "windows.h"
    
    #include "dll.h"
    
    using namespace std;
    
    #define  DLL_DIRECTORY L".\\dll.dll"
    
    int main (void)
    {
    	HMODULE hDLL = LoadLibrary(DLL_DIRECTORY);
    	DWORD fehler = GetLastError(); //hier ist noch alles OK
    
    	//Wie rufe ich hier die Funktion test() oder die Funktion Add() auf????
    	return 0;
    }
    

    Der Hinweis von Microsoft hilft mir leider nicht:
    "dllexport Classes ...."
    [url]
    http://msdn.microsoft.com/en-us/library/81h27t8c(VS.80).aspx
    [/url]

    Danke für die Antworten.



  • Du musst GetProcAddress verwenden.



  • GetProcAddress geht ja nur bzgl. Funktionen die mit
    extern "C" declspec(dllexport) gekennzeichnet sind.

    Aber auf was soll ich GetProcAddress anwenden? Ausserdem sagt Microsoft dazu gar nichts. MS sagt ja (siehe obiger Link):
    "When you declare a class dllexport, all its member functions and static data members are exported. You must provide the definitions of all such members in the same program."
    Aber genau das hab ich ja gemacht. Definitionen der Klassenmember cHallo sind ja in der dll.cpp definiert.



  • Ach so, Klassen exportieren (mein Fehler, hab's nur überflogen). Sorry, damit kenne ich mich nicht aus... 🤡



  • Ein bekannte Suchmaschine hat mich hierhin geführt:
    http://www.codeproject.com/KB/DLL/classesexportedusingLL.aspx

    P.S: Ein anderer Ansatz wird in einem der Kommentare dazu gezeigt: "Interesting but not practical", mittels virtuellen Methoden und einer Generatorfunktion.
    (besser für Plugin-Systeme geeignet).


Log in to reply