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.OBJHILFÄ... 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 ?