Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Moewe
Anmeldungsdatum: 21.03.2013 Beiträge: 4
|
Verfasst am: 21.03.2013, 08:10 Titel: FreeBasic DLL unter Excel VBA - byref funktioniert nicht |
|
|
Hi,
möchte meinen VBA-Code mit einer DLL etwas absichern - bin Gestern zum erstenmal auf Freebasic gestoßen, war gleich davon angetan, und habe ein kleies Beispiel getestet, das bei Parameterübergabe mit byval auch funktioniert:
in Freebasic:
Code: |
Function cube alias "cube" (byval arg As Double) as Double export
cube = arg^3
End Function
|
in VBA:
Code: |
Public Declare Function cube Lib "dllex1.dll" Alias "cube@8" (ByVal arg As Double) As Double
Sub Call_Test()
Dim dblTest As Double
dblTest = 3
dblTest = cube(dblTest)
Debug.Print dblTest 'Ergebnis ist 27
End Sub
|
Ändere ich aber jetzt byval auf byref auf beiden Seiten ab, erhalte ich die Fehlermeldung "Laufzeitfehler '453' DLL-Einsprungpunkt ... nicht gefunden"
Habe gelesen, dass über diesen Weg (falls er mal funktioniert) in einem Array nur 64kByte Daten übergeben werden können - dann muss ich mich eh nach was anderem umsehen!?
LG
Moewe |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Sebastian Administrator
![](images/avatars/563932275488e4d20c5ee9.jpg)
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.03.2013, 11:25 Titel: |
|
|
Hallo Moewe,
willkommen im Forum!
VBA wird, was die FB-DLL-Nutzung angeht, wahrscheinlich sehr ähnlich zu VisualBASIC 6 sein. Grundsätzlich dürfte es von daher möglich sein, auch mit ByRef zu arbeiten. Nur bei ByRef-String-Parametern scheint es mitunter etwas kniffeliger zu werden:
Zitat: | '' note: the argument must be passed by value (ByVal), VB6 seems to not
'' pass the BSTR correctly by reference without a COM type-library |
Hast du eigentlich auch
Code: | extern "windows-ms" |
in deinem FB-DLL-Code?
Falls du da noch nicht geschaut hast, könntest du mal im Unterordner "examples/dll/VB" deiner FB-Installation schauen. Alternativ ist vielleicht auch dieses Codebeispiel hier interessant: http://www.enzinger.net/FBandVB.html Darin verwendet der Autor auch ByRef-Argumente.
Zur Datenmenge:
Moewe hat Folgendes geschrieben: | Habe gelesen, dass über diesen Weg (falls er mal funktioniert) in einem Array nur 64kByte Daten übergeben werden können |
Zumindest FreeBASIC-seitig sollte keine derartige Beschränkung vorhanden sein. In FreeBASIC kann Speicher im Gigabyte-Bereich verwendet werden, sofern vorhanden, wenn auch begrenzt auf max. ~ 2 GB pro laufende Anwendung, soweit ich weiß.
Wenn du größere Datenmengen übergibst, ist es für die Argumenten-Übergabe normalerweise völlig egal, wie groß die Datenmenge genau ist, da man dann keine Kopie der Daten übergibt, sondern lediglich einen Zeiger auf ihren Anfang und ggf. die Information, wie weit der Speicherblock reicht bzw. wie lang das Array ist. D.h. die Argumente sind dann immer nur 8 Byte oder so lang, auch wenn vielleicht ein Speicherbereich von 20 MB verarbeitet werden soll.
Ob VBA eine solche Größenbeschränkung für Arrays bzw. übergebene Arrays hat, kann ich adhoc nicht sagen. Wenn du diese Größenbeschränkung bei anderen DLLs nicht hast, wirst du sie bei FreeBASIC-DLLs aber auch nicht haben. Die Zahl "64 KB" kenne ich als problematische Grenze eigentlich nur vom alten QBASIC/QuickBASIC (für DOS).
Zurück zu ByRef:
Hier könnte man evtl. auch mit einem anderen Konstrukt arbeiten, um den Datenblock auszutauschen. Man könnte einen TYPE (UDT) erstellen (wie "struct" in C), in diesen ein paar Header-Informationen (Datenlänge, Fehlerflags, ...) und Zeiger auf Datenblöcke einbauen. Also so ähnlich, wie du z. B. ShellExecuteEx mit einem struct-Parameter aufrufen würdest.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 21.03.2013, 11:35 Titel: |
|
|
Aloha Moewe,
ich hab mich vor längerer Zeit mit dem gleichen Thema beschäftigt
http://forum.qbasic.at/viewtopic.php?p=72452#72452
Mit "byref" Übergabe hat es nicht funktioniert, da ich nicht die Datenstruktur unter Excel kannte. Die Übergabe von Texten (String) war schon sehr kompliziert.
In freebasic.net findest du bestimmt mehr Informationen dazu,
http://www.freebasic.net/forum/viewtopic.php?f=8&t=13298 . _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Moewe
Anmeldungsdatum: 21.03.2013 Beiträge: 4
|
Verfasst am: 21.03.2013, 23:50 Titel: |
|
|
Hallo und Danke für die hilfreichen Antworten,
zumindest habe ich meine kleine Testprozedur zum Laufen gebracht (es lag wohl an der fehlenden EXTERN "windows-ms". Auch mit einem "_" im Namen der Funktion gab es Probleme!
So funktionieren jetzt eine Sub und eine Function:
Freebasic:
Code: |
'*****************************************************
EXTERN "windows-ms"
'*****************************************************
SUB cube (BYREF arg As LONG) EXPORT
arg = arg + 1
END SUB
FUNCTION cube2 (BYREF arg As LONG) AS LONG EXPORT
arg = arg + 1
cube2 = arg +10
END FUNCTION
'*****************************************************
END EXTERN
|
VBA:
Code: |
Declare Sub cube Lib "dllex1.dll" (ByRef arg As Long)
Declare Function cube2 Lib "dllex1.dll" (ByRef arg As Long) As Long
Sub Call_Test()
Dim dblTest As Long
Dim dblTest2 As Long
dblTest = 3
Call cube(dblTest)
Debug.Print dblTest
dblTest2 = cube2(dblTest)
Debug.Print dblTest
Debug.Print dblTest2
End Sub
|
Nach einigen erfolglosen weiteren Versuchen mit der Übergabe von Arrays bezweifle ich allerdings, dass ich mein Projekt mit Freebasic gestemmt bekomme - werde wohl eher weiter in Richtung VB6 gehen!?
Gruß und Danke
Moewe |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Sebastian Administrator
![](images/avatars/563932275488e4d20c5ee9.jpg)
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 22.03.2013, 00:08 Titel: |
|
|
Zitat: | bezweifle ich allerdings, dass ich mein Projekt mit Freebasic gestemmt bekomme |
Man kann selbstverständlich auch größere Datenblöcke an FreeBASIC übergeben. In Sachen Performance/Durchsatz und Kapazität ist FreeBASIC dem alten VB6 (von 1998) überlegen.
VB6 hat jedoch den Vorteil, dass man damit sehr komfortabel und intuitiv grafische Oberflächen für Windows zusammenklicken/erstellen kann (bei FreeBASIC mitunter schwieriger, aber auch vollständig möglich). Des Weiteren könnte man vermuten, dass VB6 eine besonders gute Kompatibilität zu VBA besitzt. VB6 und VBA sind sich ja von der Sprache und sogar der IDE her sehr ähnlich und natürlich beides Produkte aus dem gleichen Hause. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Moewe
Anmeldungsdatum: 21.03.2013 Beiträge: 4
|
Verfasst am: 22.03.2013, 07:46 Titel: |
|
|
Zitat: |
Des Weiteren könnte man vermuten, dass VB6 eine besonders gute Kompatibilität zu VBA besitzt.
|
Kann ich nur bestätigen, Sebastian
ich hatte schon mal mit VB6.0 eine komplexe Anwendung mit graphischer Oberfläche programmiert. Den Programmkern hatte ich zuvor schon in Excel-VBA programmiert und im Prinzip 1:1 übernommen.
Man muss im Excelcode dann nur beachten, dass man möglichst wenige Excel-Spezifika wie Zellbezüge benutzt und in Excel schon die Daten an zentraler Stelle über globale Variablen oder ini-Dateien händelt.
Der jetzige Anwendungsfall liegt anders - das Programm soll als Excel-Anwendung verkauft werden, der Anwender soll die Möglichkeiten von Excel nutzen können und bei Bedarf auch eigene Makros erstellen können und Zugriff auf den Quellcode bekommen. Wichtige Routinen mit der eigentlichen Programmintelligenz und zum Abprüfen der Lizenz (über Laufwerk, Netzwerkadresse oder IBAN des Kunden) will ich in eine DLL auslagern. Ich muss dabei auch ganze Zellbereiche an Daten (u.U. tausende von Zeilen mit bis zu 50 Spalten) an die DLL-Funktionen übergeben. Das geht zwar auch mit überschaubarem Aufwand über Textdateien, ist dann aber nicht so schnell und smart wie bei Parameterübergabe in der Funktion.
Leider kann ich mit meiner VB6-Version keine DLL erzeugen, bin deshalb auf der Suche nach kostengünstigen Alternativen oder ich muss mir eine Vollversion zulegen. Mit dem neueren Zeugs .Net usw. kenne ich mich nicht aus, mit C-Varianten habe ich mich schon vor mehr als 20 Jahren rumgequält - möchte also beim gewohnten Basic bleiben.
Vielleicht hat noch jemand einen anderen Lösungsvorschlag? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 22.03.2013, 14:53 Titel: |
|
|
Nichts gegen deine Werbung Horst,
aber mit Freebasic erspar ich mir
Vollversion: PB/WIN 10.03 + PB/CC 6.03 EUR 285,60 (http://www.powerbasic.de/html/preisliste.html)
und ich bin sicher mit PB wird kein Lösungsvorschlag für Moewe geliefert. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 26.03.2013, 18:30 Titel: |
|
|
Für einen Compiler bezahlen? Das ist so 70er Jahre… ![Kopf schütteln](images/smiles/icon_nonono.gif) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|