|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ooops
Anmeldungsdatum: 03.10.2005 Beiträge: 16 Wohnort: Bremen
|
Verfasst am: 07.10.2005, 16:58 Titel: |
|
|
Hallo vspickelen,
das hat für Excel auch schon ein Wolf W. Radzinski gemacht:
www.rendar.de (dort die Nr.
http://www.rendar.de/excel/langezahlen/basis_umwandlungen.xla
Vielleicht kannst Du mir noch weiterhelfen in der String -> DLL - Sache:
Ich hätte gern zu dem "gepointeten String" als Argumente auch noch Zahlen übergeben und einen weiteren String. Als Rückgabe brauche ich nur den "gepointeten String". Hast Du da auch noch ne Lösung? (Für Hauptprogramm und .DLL)
Übrigens: Deine Lösung arbeitet ja mit Sub, wo ich eigentlich eine Function haben wollte. Ich habe aber in der Doku zu FB unter dem Keyword "Export" ein Beispiel für eine Function gefunden, die in VBA (also dem Hauptprogramm zum Aufruf der Funktion der .DLL) nicht unterstützt wird:
DIM <FktName> AS FUNCTION (...) AS <Datentyp> <- Funktionspointer
Deine Sub umgeht dies und funktioniert! |
|
Nach oben |
|
|
vspickelen
Anmeldungsdatum: 12.06.2005 Beiträge: 13 Wohnort: Holland
|
Verfasst am: 10.10.2005, 22:53 Titel: |
|
|
ooops hat Folgendes geschrieben: | Ich hätte gern zu dem "gepointeten String" als Argumente auch noch Zahlen übergeben und einen weiteren String. Als Rückgabe brauche ich nur den "gepointeten String". |
Etwa wie
Code: | Declare Sub Lower Lib "Strdll" Alias "Lower@16" (ByRef s As _
String, ByRef z As String, ByVal a As Long, ByVal b As Long)
Function LowCase()
g$ = "ARGeWEPLOF"
h$ = "hrumph"
k = 1: l = 2
Lower g$, h$, k, l
LowCase = g$
End Function |
Übrigens soll man ab FB 0.13 in einem DLL eigentlich ByVal strings nützen, sehe
http://www.freebasic.net/forum/viewtopic.php?t=1436
Zitat: | v1ctor
To receive strings from, or pass strings to libraries compiled by different compilers, always declare the args as "Byval mystring as string", the pointer to the string data will be passed, not to the descriptor. |
Grüße,
vspickelen |
|
Nach oben |
|
|
Steini63
Anmeldungsdatum: 11.11.2004 Beiträge: 28 Wohnort: 30926 Seelze
|
Verfasst am: 06.11.2005, 14:15 Titel: @Zahl - Bug in freeBasic-DLLs |
|
|
Hallo!
Ich habe mal versucht, die mydll.dll in RapidQ zu laden. Es funktioniert nur, wenn ich die Funktion als AddNumbers@8 anspreche. Das Verhalten ist also identisch zu IBasic.
Dann habe ich mit 'nem Hexeditor in mydll.dll "@8" durch je ein "CHR$(0)" ersetzt. Jetzt kann ich die Funktion als "AddNumbers" aktivieren. Mit freeBasic bleibt der Aufruf unverändert; testload.bas funktioniert weiterhin.
FreeBasic-Version ist FB_Win32_20051026 .
Gruß Steini _________________ Viele Grüße Steini
http://www.FrankSteinberg.de +++++++ Planung ist das Ersetzen des Zufalls durch den Irrtum +++++++ |
|
Nach oben |
|
|
PeterHarder
Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
|
Verfasst am: 11.01.2006, 00:48 Titel: Re: DLL und Strings |
|
|
Hallo "H.Brill",
ich hab jetzt die ultimative Lösung für die Rückgabe von Strings als Funktionswert (also nicht über die Parameterliste) gefunden: Es geht über ZString!
Anfangs hattest du hier folgendes (nicht funktionierende) Beispeil gebracht:
Code: |
Function Lower (byref a as String ) as String export
Dim t as String
t = LCase$(a)
Lower = t
End Function
|
Dieses Beispiel muss wie folgt verändert werden:
Code: |
Function Lower (byref a as String ) as ZString Ptr Export
Dim t as ZString * Len(a)+1
t = LCase$(a)
Lower = @t
End Function
|
Neben der Dimensionierung als "ZString" und Festlegung der Länge ist es also wichtig, in den Kopf statt "String" jetzt "ZString Ptr" zu schreiben (nur "ZString" ohne "Ptr" geht nicht). Damit dann auch der Pointer zurückgegeben wird, ist es weiterhin wichtig, bei der Rückgabe ein "@"-Zeichen vor die Variable zu setzen.
Im Hauptprogramm kannst du trotzdem den Rückgabewert als "As String" geklarieren; dass merkt den Beschiss nicht, da das Hauptprogramm sowieso nur einen Pointer auf einen Nullbyte-Rerminieren String erwartet. Der Compiler wird es dann erledigen, dass dieser Nullbyte-Terminierte String in das entsprechende Basicvariablen-Format überführt wird (jedenfallst ist das bei meinem GFA-Basic-Compiler so).
Die Rückgabe funktioniert nicht, wenn man den Pointer auf einen "normalen String" zurückgibt, und zwar auch dann nicht, wenn man diese Pointerrückgabe im Kopf der Funktion als "Long" deklariert - warum das nicht geht, weiß ich allerdings auch nicht.
Liebe Grüße
Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 11.01.2006, 19:18 Titel: |
|
|
Code: | Dim t as ZString * Len(a)+1 |
Du kannst doch nicht mit einer Varibel eine Variabel deklarien.
Freebasic lieferft (Meiner Meinung nach korrekt) eine Fehlermeldung.
Auch
Zitat: | Im Hauptprogramm kannst du trotzdem den Rückgabewert als "As String" geklarieren; dass merkt den Beschiss nicht, |
Stimmt bei Freebasic nicht, das "schmeckt" den Beschiss ... _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
|
|
|
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.
|
|