- Beiträge
- 21.965
- Reaktionspunkte
- 6.836
-> Hier kostenlos registrieren
Libnodave 64-Bit (libnodave_jfkmod64.dll) mit Excel/VBA 64-Bit
In Excel-VBA können Struct ("benutzerdefinierter Typ") nicht als Wert (ByVal) übergeben werden. Vermutlich daher bei daveNewInterface(..) die Übergabe der zwei Handle einzeln in VBA 32-Bit. Warum das gleiche Vorgehen in der 64-Bit Variante zum Excel-Absturz führt weiss ich nicht. Ich habe alles mögliche ausprobiert...
(Gibt es von der 64-Bit-Kompilierung der DLL ein List-File, wo man sehen kann, welcher Maschinencode erzeugt wurde?)
Zum Glück bietet Libnodave die Funktion daveNewInterface(..) auch als Variante mit Übergabe des Struct als Referenz: davePascalNewInterface(..) Damit funktioniert auch Excel 64-Bit.
Der blaue Code führt zum Erfolg:
Harald
In Excel-VBA können Struct ("benutzerdefinierter Typ") nicht als Wert (ByVal) übergeben werden. Vermutlich daher bei daveNewInterface(..) die Übergabe der zwei Handle einzeln in VBA 32-Bit. Warum das gleiche Vorgehen in der 64-Bit Variante zum Excel-Absturz führt weiss ich nicht. Ich habe alles mögliche ausprobiert...
(Gibt es von der 64-Bit-Kompilierung der DLL ein List-File, wo man sehen kann, welcher Maschinencode erzeugt wurde?)
Zum Glück bietet Libnodave die Funktion daveNewInterface(..) auch als Variante mit Übergabe des Struct als Referenz: davePascalNewInterface(..) Damit funktioniert auch Excel 64-Bit.
Der blaue Code führt zum Erfolg:
Code:
[COLOR="#0000FF"]Public Type daveOSserialType
rfd As LongPtr
wfd As LongPtr
End Type
Private Declare PtrSafe Function davePascalNewInterface Lib "libnodave_jfkmod64.dll" (ByRef fds As daveOSserialType, ByVal name As String, ByVal localMPI As Long, ByVal protocol As Long, ByVal speed As Long) As LongPtr[/COLOR]
Sub readFromFAFM()
Dim ph As LongPtr, di As LongPtr, dc As LongPtr
[COLOR="#0000FF"]Dim fds As daveOSserialType[/COLOR]
[COLOR="#008000"]'...
'Call daveSetDebug(daveDebugAll)[/COLOR]
Peer$ = "192.168.196.196"
ph = openSocket(102, Peer$)
If (ph > 0) Then
[COLOR="#0000FF"]fds.rfd = ph
fds.wfd = ph[/COLOR]
[COLOR="#008000"]' di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k) 'schmiert ab![/COLOR]
[COLOR="#0000FF"]di = davePascalNewInterface(fds, "IF1", 0, daveProtoISOTCP, daveSpeed187k)[/COLOR] 'funktioniert
res = daveInitAdapter(di)
If res = 0 Then
dc = daveNewConnection(di, MpiPpi, Rack, Slot)
res = daveConnectPLC(dc)
Harald