Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

FreeBasic DLL unter Excel VBA - byref funktioniert nicht

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Moewe



Anmeldungsdatum: 21.03.2013
Beiträge: 4

BeitragVerfasst am: 21.03.2013, 07:10    Titel: FreeBasic DLL unter Excel VBA - byref funktioniert nicht Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.03.2013, 10:25    Titel: Antworten mit Zitat

Hallo Moewe,

willkommen im Forum! lächeln

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
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 21.03.2013, 10:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Moewe



Anmeldungsdatum: 21.03.2013
Beiträge: 4

BeitragVerfasst am: 21.03.2013, 22:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.03.2013, 23:08    Titel: Antworten mit Zitat

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.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Moewe



Anmeldungsdatum: 21.03.2013
Beiträge: 4

BeitragVerfasst am: 22.03.2013, 06:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 107

BeitragVerfasst am: 22.03.2013, 12:47    Titel: Antworten mit Zitat

Zitat:
- möchte also beim gewohnten Basic bleiben.
Vielleicht hat noch jemand einen anderen Lösungsvorschlag?


Basic und DLL ---> PowerBASIC für Windows


http://www.powerbasic.com/support/help/pbwin/index.htm
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 22.03.2013, 13:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 26.03.2013, 17:30    Titel: Antworten mit Zitat

Für einen Compiler bezahlen? Das ist so 70er Jahre… Kopf schütteln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz