[Erledigt] Funktionen und Klassen aus DLL exportieren



  • Grüß euch!

    Ich lade meine DLL zur Runtime und möchte daraus via

    GetProcAddress(Module, ProcName);
    

    die Adresse einer Funktion laden, um sie später aufzurufen.

    Wenn ich nun in meiner DLL

    __declspec( dllexport )
    void TestFunc( void )
    {
    	MessageBox( 0, "Test", "Test:", MB_OK );
    }
    

    deklariere, generiert mein Linker:

    ?TestFunc@@YAXXZ
    

    mit einer definition à la

    extern "C" __declspec( dllexport )
    void TestFunc( void )
    {
        MessageBox( 0, "Test", "Test:", MB_OK );
    }
    

    bekomm ich die Dekoration weg. Ist das "legal"?

    1. Wie definiere ich eine Klasse in einer DLL un sie in meiner Executeable zu instantiieren?

    Aus

    class __declspec( dllexport ) TestClass {
        public:
            void test() {
                MessageBox( 0, "Hello, Class!", "Test:", MB_OK );
            }
    };
    

    macht der linker zwar

    ??4TestClass@@QAEAAV0@ABV0@@Z
    ?test@TestClass@@QAEXXZ
    

    aber ich hab' keinen Plan, wie ich nun meine TestClass instantiieren soll. Da braucht mein Programm (welches die DLL lädt) doch die deklaration von TestClass, oder? Nun, wenn ich meinem Programm nun die Deklaration von TestClass mit

    class __declspec( dllimport ) TestClass {
        public:
            void test();
    };
    

    verrate, kann ich sie zwar instantiieren aber der Linker hat keinen Dunst von der adresse von TestClass::test() womit

    TestClass c;
    c.test();
    

    auch wieder nicht funktioniert.

    Wer kann mir behilflich sein?

    <disclaimer>
    Hab' Google gefragt, jedoch nichts brauchbares gefunden.
    Benutze Microsoft Visual Studio .net 2003 unter Windows Server 2003.
    </disclaimer>

    thxia, Swordfish

    [edit: Erledigt]



  • 1. Das einfachste ist, Du verwendest eine def-Datei, indem der Name undekoriert reingeschrieben wird
    2. Du verwendest 'extern "C"', dann ist der Namen zumindest nicht mehr ganz so unschön
    3. Klassen via GetProcAddress einzubinden wird nicht unterstützt



  • Besten Dank für Deine Antwort.

    Das instantiieren der Klassen hat sich erübrigt:
    Ich verwende eine virtuelle Basisklasse als Interface.

    Aber wie erstelle und verwende ich eine .def-Datei?
    Ist die verwendung von

    extern "C" //...
    

    nicht eher unschön?



  • Was schön oder unschön ist musst Du selber festlegen.
    Eine Def-Datei ist eine normale Textdatei der Form:

    EXPORTS
    Funktion1
    Funktion2

    Diese musst Du einfach in Deiner Linker Einstellungen der DLL angeben



  • Danke!


Anmelden zum Antworten