Page 1 of 2

VBA DLL Beispiel

Posted: Mon 1. May 2017, 20:43
by Searcher
Hi,
ich habe das Programm heute zum ersten mal angeschaut und bin erstmal erstaunt wie viel Funktionalität da drinn steckt.
Bei meinem Versuch das VBA DLL Beispiel zum Laufen zu bringen bin ich aber erstmal gescheitert.

Bei Start des Makros in Excel meldet mein Excel (aus Office 2016) erstmal dass die "Declare" Anweisungen nicht korrekt sind für 64Bit, ich habe daher alle mit "Declare PtrSafe" ersetzt. Jetzt startet das Makro schonmal.

Sobald ich einen Button Drücke kam dann aber "DLL Datei nicht gefunden". OK, etwas rumgesurft und die Datei "MembrainDLL64" gefunden, kopiert und überall folgendes eingetragen, Declare PtrSafe Sub MB_AddNet Lib "MemBrainDll64.dll". Jetzt läuft das Makro etwas weiter bricht dann aber mit Laufzeitfehler 453 "DLL Einsprungpunkt __MB_GetVersionInfo@8 in MembrainDLL64.dll nicht gefunden" ab.

Nun bin ich mit meinem Leien-Wissen am Ende.

Gibt es vielleicht eine neuere Excel-Datei mit VBA Makro das die MemBrain Funktionen aufruft?

Für jede Hilfe wäre ich dankbar

Grüße

Re: VBA DLL Beispiel

Posted: Mon 1. May 2017, 22:29
by TJetter
Hallo,

tatsächlich sind die VB-Deklarationen momentan nur für die 32 Bit Dll-Variante verfügbar, da muss ich zeitnah nachlegen, danke für den Hinweis.
Es sollte sich so verhalten:
Überall, wo eine dll-Schnittstelle einen string erwartet und überall wo ein Wert by reference ('ByRef') übergeben wird, werden in der 64 Bit Variante nicht 4, sondern 8 byte Parameterlänge erwartet. Das '@x' hinterdem Funktionsnamen bezeichnet die insgesamt für alle Parameter erwartete Länge in Byte.

z.B.:
__MB_GetVersionInfo@8" (ByVal infoStr As String, ByVal maxLen As Long)
--> 4 Byte für den String (der hinter den Kulissen ein Pointer ist) und 4 Byte für die maximale Länge.

--> Müsste für die 64-Bit Variante heißen;
__MB_GetVersionInfo@12" (ByVal infoStr As String, ByVal maxLen As Long)
--> 8 Byte für den String (der hinter den Kulissen ein Pointer ist) und 4 Byte für die maximale Länge.

Funktioniert es damit? Kann es auf die Schnelle selbst nicht testen...

Nachtrag: Kann sein, dass 'Long' auch noch durch 'Integer' zu ersetzen ist, müsste ich erst mit etwas mehr Zeit checken.

Viele Grüße

Re: VBA DLL Beispiel

Posted: Tue 2. May 2017, 17:24
by Searcher
Hallo Thomas,

vielen Dank für die super schnelle Antwort.

Ich werd versuchen das zu testen, brauch vielleicht aber etwas länger als Du.

Grüße

Searcher

Re: VBA DLL Beispiel

Posted: Tue 2. May 2017, 20:47
by TJetter
TJetter wrote:Nachtrag: Kann sein, dass 'Long' auch noch durch 'Integer' zu ersetzen ist, müsste ich erst mit etwas mehr Zeit checken.
Nach ein bisschen Literatur-Recherche sollte das nicht nötig sein, der Datentyp 'Long' ist unter 64 Bit Office anscheinend immer noch 4 bytes lang.

Austesten kann ich das Ganze ad hoc leider nicht, habe kein 64 Bit Office zur Verfügung.

Re: VBA DLL Beispiel

Posted: Tue 2. May 2017, 23:19
by Searcher
Hi, ich hab jetzt mal getestet

Test 1:
' Get the version information string of the DLL.
' Specify maximum length of string to be copied (excluding the terminating '\0'.
' A terminating '\0' will be attached in every case.

wie folgt declariert:
Private Declare PtrSafe Function MB_GetVersionInfo Lib "MemBrainDll64.dll" _
Alias "__MB_GetVersionInfo@12" (ByVal infoStr As String, ByVal maxLen As Long) As Long

Ergebnis:
"DLL Einsprungpunkt __MB_GetVersionInfo@12 in MembrainDLL64.dll nicht gefunden“

Test 2:
' Load the currently active neural net from the given *.mbn file (including path)

wie folgt declariert:
Private Declare PtrSafe Function MB_LoadNet Lib "MemBrainDll64.dll" _
Alias "__MB_LoadNet@8" (ByVal fileName As String) As Long

Ergebnis
"DLL Einsprungpunkt __MB_LoadNet@8 in MembrainDLL64.dll nicht gefunden“

.. leider ohne Erfolg, woran kann es noch liegen?

Grüße

Searcher

Re: VBA DLL Beispiel

Posted: Wed 3. May 2017, 19:59
by TJetter
ich habe mir die 64 Bit Version der dll nun etwas genauer angesehen und stelle fest, dass die Funktionen darin offenbar - in Abweichung zu der 32 Bit Version - anders benamt sind:

Die Funktionen beginnen darin alle nur mit EINEM Unterstrich und die Ergänzung @xx entfällt.

Bsp:
32 Bit:
__MB_AddHidden@12

64 Bit:
_MB_AddHidden

Kannst Du es mit dieser Herangehensweise einmal versuchen, bitte?

Ich vermute, dass die Funktionen dann gefunden werden. Allerdings weiß ich nicht, ob sie korrekt aufrufbar sein werden, da ich vermute, dass eine andere Deklarationsart vorliegt. Das werde ich aber noch genauer untersuchen. Möglich, dass bei der Erzeugung der 64 Bit DLL eine andere Deklarationstechnik verwendet wurde, das muss ich dann ggf. anpassen.

Viele Grüße und Danke für's Testen!

Re: VBA DLL Beispiel

Posted: Wed 3. May 2017, 22:37
by Searcher
Ist doch ein Schrittchen weiter, ich werde es testen
Grüße
Searcher

Re: VBA DLL Beispiel

Posted: Thu 4. May 2017, 20:15
by TJetter
Also,

nach einiger Recherche habe ich festgestellt, dass unter Win64 die Aufrufkonvention 'stdcall' ignoriert wird. Diese Aufrufkonvention erzeugt bei einer 32 Bit dll die 'Function Name Decorations', d.h., den zusätzlichen Unterstrich am Anfang und das @xx mit der Anzahl Parameter-Bytes.

Soll heißen: Technisch ist das so OK, und die Funktionen sollten ohne die Name Decoration, also wie im vorigen Post beschrieben, korrekt aus der 64 Bit Dll aufgerufen werden können.

Bin gespannt auf ein erstes Testergebnis, vielen Dank nochmal vorab!

Re: VBA DLL Beispiel

Posted: Thu 4. May 2017, 23:59
by Searcher
Hi,

mit suchen und ersetzen alle Prozeduraufrufe umgeschlüsselt und stichprobenartik 4 getestet
- ES KLAPPT !
Danke vielmals.

Damit sind die technischen Voraussetzungen wohl gegeben und ich kann mich jetzt an mein eigentliches Projekt machen.
Ich wollt mich an ein kleines aber cleveres Spiel ranwagen und einen halbswegs klugen Spieler entwickeln.

Noch ein langer Weg, wird aber bestimmt lehrreich und spannend.

Grüße

Searcher

Re: VBA DLL Beispiel

Posted: Fri 5. May 2017, 20:07
by TJetter
Hallo,

das freut mich, prima!

Kannst Du mir die angepassten Deklarationen zukommen lassen? Dann würde ich sie zum Download bereitstellen und auch ins nächste Release aufnehmen.

Vielen Dank und Grüße,