DLL bzw. LIB anhand eines VB Beispiels in C++ einbinden



  • Hallo,

    also ich habe von jemandem der uns zuprogrammieren wird eine kleine Test Dll bekommen um die Schnitstelle zwischen ihm und uns zu testen.

    Er programmiert unter Fortran.

    Ich habe hier also eine DLL bekommen und eine LIB.

    TEST.DLL und TEST.LIB

    Die lib war wohl für das VS. Ich habe mir also mit implib eine für den BCB gebaut.

    Ich habe bisher noch NIE mit DLLs gearbeitet und muss mir das jetzt basteln

    Ich habe ein Beispiel in VB Code bekommen....

    Module Mod
      Declare Function ADDS Lib "TEST" (ByRef A As Single, ByRef B As
    Single) As Single
      Declare Function ADDV Lib "TEST" (ByRef N As Integer, ByRef A As
    Single) As Single
      Declare Sub ADDM Lib "TEST" (ByRef N As Integer, ByRef M As Integer, ByRef A As Single, ByRef RES As Single)
      Sub main()
        Dim a As Single
        Dim b As Single
        Dim c() As Single
        Dim D(,) As Single
        Dim Res() As Single
        Dim m As Integer
        Dim n As Integer
        Dim i As Integer
        Dim j As Integer
        n = 5
        m = 8
        ReDim D(m - 1, n - 1)
        ReDim c(n - 1)
        ReDim Res(n - 1)
        For j = 0 To n - 1
          c(j) = 2 * j
          For i = 0 To m - 1
            D(i, j) = j + 2 * i
          Next
        Next
        a = 5
        b = 6
        '
        'Ergebnis:  11
        '
        MsgBox(ADDS(a, b))
        '
        'Ergebnis:  20
        '
    
        MsgBox(ADDV(n, c(0)))
        Call ADDM(n, m, D(0, 0), Res(0))
        For j = 0 To n - 1
          '
          '
          'Ergebnis RES: 10,20,30,40,50 
          '
          '
          '
          MsgBox(CStr(j) & Space(2) & CStr(Res(j)))
        Next
      End Sub
    
    End Module
    

    Ich habe:
    - Die DLL und die LIB ins Verzeichnis des Programms gelegt
    - Die Lib per Datei hinzufügen zum Projekt geaddet
    - extern __declspec(dllimport) double ADDS(double* A, double* B); in mein Projekt eingesetzt. Und zwar in die Header Datei der Unit.
    - Dann einen Funktionsaufruf gestartet: double result = ADDS(add1, add2);
    Wobei double* add2; double* add1;
    - Fazit: [Linker Fehler] Error: Ungelöste externe 'ADDS(double *, double *)' referenziert von D:\DIPLOMARBEIT\UFO\INTERFACE\DEBUG_BUILD\TEST.OBJ

    HILFÄ... Derjenige wartet auf eine Antwort.



  • Hallo,

    Vielleicht stimmt hier die Parameterliste und somit die signatur der Funktion nicht. Hol dir doch mal mit impdef die Liste der exportierten Funktionen. Evtl. kann man daraus ersehen wie die korrekte Signatur lautet.



  • Ah cooles Tool. Danke. Ich probiers.

    EDIT:

    LIBRARY     TEST.DLL
    
    EXPORTS
        ADDM                       = _ADDM@16                         
        ADDS                       = _ADDS@8                          
        ADDV                       = _ADDV@8
    

    Öhm ok...

    Also die Source Codes sind in Fortran geschrieben. Das kann ich sagen.



  • Noch was. Der Datentyp Single bei VB entspricht dem float bei C++ und nicht dem double.



  • ByRef a As Single

    ist doch dann

    float* a=new float;
    float* b=new float;

    Oder lieg ich da falsch???

    Und als Parameter dann ADDS(a,b);



  • Hallo

    Wenn du diese Funktionsdeklaration hast

    extern __declspec(dllimport) double ADDS(float* A, float* B);
    

    rufst du die am besten so auf

    float a;
    float b;
    ADDS(&a, &b);
    

    bis bald
    akari



  • Ich kann machen was und wie ich will... IMMER unaufgelöste externe....

    Ich kenn den Aufruf nicht. Das sit meine Interpretation. Ich hab diesen VB Code vom Programmierer der DLL. Fertig. Mehr nicht.

    Und ich kann kein VB... DEswegen habe ich auch NULL Plan wie ich die Funktion deklarieren muss. Mal davon abgesehen, daß ich keine Ahnung hab ob die DLL richtig eignebunden ist.



  • Wenn du die lib eingebunden hast und keine Fehlermeldung kommt, dann ist auch die dll mit eingebunden. Alternativ könntest du ja auch mal dynmaische Bindung probieren.
    http://bcb-tutorial.c-plusplus.net/DLL_Tutorial/artikel5.html
    Da siehst du dann eher ob die Eibindung geklappt hat.
    Funktionen aus Fortran benötigen den Modifieziere __stdcall. Evtl. mußt du deine Importdeklaration dahingehend abändern.
    siehe auch hier
    http://www.neurophys.wisc.edu/comp/docs/notes/not017.html#fcall



  • Mh aber der def Datei und dem Tutorial nach sind die mit dem "C" exportiert ?


Anmelden zum Antworten