PDA

Vollständige Version anzeigen : (double) Array an DLL übergeben


AnTri
25.09.2003, 11:53
Hallo, wie übergebe ich einen (mehrere) Array's (double) an eine DLL. Die DLL ist in C geschrieben und erwartet eine Referenz auf ein Array...

Ich habe es schon mit folgender declare-Anweisung probiert...

Declare Function dllTest Lib "testdll.dll" Alias "testfunc" (ByRef testin() As double, ByRef testout() As double) As Double


Leider kann ich aber den Array nachdem ich die Funktion aufgerufen habe, nicht mehr ansprechen.
Wenn ich in C die Parameter anschaue, stehen alle auf 0!

Sascha Trowitzsch
25.09.2003, 12:00
Zunächst mal ist die Deklaration garantiert falsch. Es müssen Pointer übergeben werden, die Long-Typen sind, nicht Double.

Declare Function dllTest Lib "testdll.dll" Alias "testfunc" (ByRef testin As Long, ByRef testout As Long) As Long

Ich vermute auch stark, dass sie nicht ByRef zu übergeben sind, sondern ByVal:

Declare Function dllTest Lib "testdll.dll" Alias "testfunc" (ByVal testin As Long, ByVal testout As Long) As Long

Ohne eine Doku zur DLL und der Parameter ist das natürlich alles Spekulation.

testin/testout deklarierst du als Double-Array:

Dim testin() As Double, testout() As Double

Ich bin mir aber nicht sicher, ob dieser VBA-Double konform mit dem Array ist, das die DLL erwartet.

Der Aufruf wäre dann jedenfalls so:

Call dllTest ( testin, testout)

Evtl. auch

Call dllTest ( VarPtr(testin), testout)

Eine DLL ohne Doku anzusprechen ist Detektivarbeit.

Ciao, Sascha

AnTri
25.09.2003, 12:07
Das mit der DLL definition ist kein Problem, da ich diese selber geschrieben habe. Hier die Function:

double WINAPI testfunc(double in[8], double out[9]);


Ausserdem: Wenn ich in VBA Array's declariere (dim test(8) as double) kann ich diese in meiner Declare-Anweisung nur mir ByRef übergeben, sonst meckert der VBA-Compiler...

Sascha Trowitzsch
25.09.2003, 12:26
Na sag's doch gleich!

Dann müsste eigentlich das gehen:

Declare Function dllTest Lib "testdll.dll" Alias "testfunc" (ByVal testin As Long, ByVal testout As Long) As Double

Aber die Arrays dürfen dann in VBA nicht dynamsch deklariert sein, sondern fest:

Dim testin(8) As Double, testout(8) As Double

Und der Aufruf:

Call dllTest (VarPtr(testin(0)), VatPtr(testout(0)))

(Hoffentlich gibt's keinen Absturz ;) )

Ciao, Sascha