Erstellte DLL functioniert unter VB (Fehler 453)



  • Hallo,
    ich muss für ein älteres Prüfprogramm eine dll in C++(VS6) schreiben, welche einige nichtunterstützte Datentypen und Strukturen in andere übersetzt. Da ich bis jetzt noch keine Erfahrungen in C++ habe, habe ich unter anderem das Beispiel http://de.wikipedia.org/wiki/Dynamic_Link_Library ausprobiert. Als Prüfprogrammersatz dient mir VB und die Declare-Anweisung.
    Hier der Code für die DLL.

    #include <windows.h>
    
    #if defined(_MSC_VER)
    #define DLL __declspec(dllexport)
    #else
    #define DLL
    #endif
    // nur unter MS VC das Symbol DLL definieren unter z.B. Linux wird DLL ignoriert
    
    // Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll
    // (in diesem Beispiel: Addieren zweier Zahlen)
    DLL
    double AddNumbers (double a, double b) {
            return a + b;
    }
    

    Und hier der Code für die VB.

    Option Explicit
    Declare Function AddNumbers Lib "Example.dll" (ByVal a As Double, ByVal b As Double) As Double
    
    Sub Main()
    Dim Result As Double
        Result = AddNumbers(1, 2)
        Debug.Print "Das Ergebnis ist: " & Result
    End Sub
    

    Die DLL wurde fehlerfrei erstellt.
    Nach dem Aufruf in VB kommt die Fehlermeldung "Angegebene DLL-Funktion nicht gefunden (Fehler 453)". Sieht man sich mit der Schnellansicht die Exporttabelle der dll an, so ist der Exportname "?AddNumbers@@YANNN@Z". Was mache ich falsch?

    MfG PierreOne



  • 1. Du musst immer "stdcall" als Aufrufkonvention verwenden (VB6 kann nix anderes)!

    double __stdcall AddNumbers(double a, double b)
    

    2. Bzgl. dem Namen: das einfachste ist eine DEF-Datei zu verwenden und dort den Namen explizit zu exportieren; dann wird er auch mit dem Namen exportiert den Du verwendet hast.
    Diese DEF-Datei dann in den Projekteinstellungen unter "Linker|Module Definition File" eintragen.

    LIBRARY "NameOf.DLL"

    EXPORTS
    AddNumbers



  • Vielen Dank,

    jetzt funktioniert Alles. 👍

    MfG PierreOne


Anmelden zum Antworten