VBA DLL Beispiel

Haben Sie Verbesserungsvorschläge oder Wünsche für eine neue MemBrain-Version? Haben Sie einen Bug entdeckt, der behoben werden sollte? Möchten Sie einfach nur eine positive oder negative Bewertung hinterlassen?

Dann ist dieses Forum der richtige Platz, um Ihren Beitrag einzubringen.
Searcher
Posts: 5
Joined: Mon 1. May 2017, 20:25

VBA DLL Beispiel

Post 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
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: VBA DLL Beispiel

Post 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
Thomas Jetter
Searcher
Posts: 5
Joined: Mon 1. May 2017, 20:25

Re: VBA DLL Beispiel

Post 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
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: VBA DLL Beispiel

Post 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.
Thomas Jetter
Searcher
Posts: 5
Joined: Mon 1. May 2017, 20:25

Re: VBA DLL Beispiel

Post 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
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: VBA DLL Beispiel

Post 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!
Thomas Jetter
Searcher
Posts: 5
Joined: Mon 1. May 2017, 20:25

Re: VBA DLL Beispiel

Post by Searcher »

Ist doch ein Schrittchen weiter, ich werde es testen
Grüße
Searcher
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: VBA DLL Beispiel

Post 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!
Thomas Jetter
Searcher
Posts: 5
Joined: Mon 1. May 2017, 20:25

Re: VBA DLL Beispiel

Post 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
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: VBA DLL Beispiel

Post 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,
Thomas Jetter
Post Reply