Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hge2001
Anmeldungsdatum: 26.02.2008 Beiträge: 18
|
Verfasst am: 17.05.2012, 18:56 Titel: Function im dll verhält sich seltsam |
|
|
Hallo,
Ich habe eine allgemeine Funktion, die einen String als ergebnis liefert in ein .DLL verlagert.
Ich stelle nun fest, dass ich diese Funktion max 256 mal aufrufen kann, danach wird immer nur ein leerer String zurückgegeben. Ich kann das auch mit einer simplen funktion simulieren
function retString(X as long) as string EXPORT
retString = "Ergebnis"
end function
von einem Hauptprogramm kann ich das 256 mal aufrufen,danach gibt es nur noch einen leeren String. Ich benutze FB 0.23.0
Gibt es dafür eine Erklärung?
Danke für Eure Hilfe
HGE |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 17.05.2012, 21:07 Titel: |
|
|
Hi,
die Rückgabe von Strings aus einer DLL geht am sichersten über einen ZString Ptr.
Als DLL:
Code: | Declare Function retString() As ZString Ptr
Function retString() As ZString Ptr Export
retString = @("Ergebnis")
End Function |
als Testprogramm:
Code: | Declare Function retString Lib "test_str"() As ZString Ptr
For i As Integer = 1 To 400
Print i, *retString
Next
sleep
|
Warum es bei Übergabetyp "String" nur 256 mal funktioniert kann ich dir leider nicht erklären. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
hge2001
Anmeldungsdatum: 26.02.2008 Beiträge: 18
|
Verfasst am: 18.05.2012, 05:29 Titel: |
|
|
@volta
Danke für den Vorschlag... so werde ich es machen.
hge |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 18.05.2012, 06:48 Titel: |
|
|
Alternativ über ByRef in der Parameterliste.
MfG
TPM
PS: ich nutze selbiges unter linux mit .so's .. und habe dort keine probs damit. Eventuell ein bug in der win version von fbc?! _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 18.05.2012, 11:04 Titel: |
|
|
Hi,
der 'ZString Ptr' workaround ist auch nur begrenzt möglich (mit konstanten Strings).
Es scheint ein Bug in der Windowsversion des FBC zu sein.
Über eine SUB geht es auch mit zusammen gesetzten Strings
Code: | Declare sub retString(a As Integer, s As String)
sub retString(a As Integer, s As String) Export
s = "Ergebnis" + Str(a)
End Sub |
Code: | Declare sub retString(a As Integer, s As String)
Dim s As String
For i As Integer = 1 To 400
retString(i,s)
Print s,
Next
sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
darkinsanity aka sts
Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 18.05.2012, 14:26 Titel: |
|
|
Probier es doch mal mit FB 0.24. Ist zwar noch nicht released, aber hier gibt es unter "Übergangslösung" ein aktuelles Paket. Vielleicht wurde der Bug ja inzwischen gefixt, daher könnte es etwas bringen den 0.24 zu nehmen. _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
|
dkl FreeBASIC-Compiler-Entwickler
Anmeldungsdatum: 25.04.2010 Beiträge: 14 Wohnort: Germany
|
Verfasst am: 18.05.2012, 15:51 Titel: |
|
|
Wie es aussieht ist das Übergeben von FB Strings zwischen DLL und .exe im Moment nicht wirklich möglich. FB benutzt ja ständig temporäre FB string Deskriptoren, die aber rtlib-spezifisch sind und nicht in einem rtlib (DLL) erstellt und im anderen (.exe) freigegeben werden können. Wenn man es doch macht bekommt man memory leaks (Deskriptoren und Inhalte), und außerdem sind im Moment nur 256 temporäre Deskriptoren erlaubt, danach gehen die gar nicht mehr.
Unter Linux wird das Problem wohl auch auftauchen, sobald mehrere rtlibs im Spiel sind, ich glaube das betrifft dann .so's die per dylibload() geladen wurden. Ich befürchte das ganze lässt sich erst fixen wenn FB strings richtige Objekte sind, das wird aber ein Riesenumbau in FB compiler/rtlib, und für FB 0.24 will ich sowas jedenfalls nicht mehr riskieren.
Es gibt im Moment zwei mögliche work-arounds:
Code: | '' Byref string parameter, aber sicherstellen das dem niemals ein temporärer
'' string zugewiesen wird, sondern nur string Variablen
sub foo( byref funcresult as string )
dim as string result
result = foo
funcresult = result
end sub |
Code: | '' Zstring Ptr anstatt String zurückgeben
function foo( ) as zstring ptr export
static as string result
result = "foo"
function = strptr( result )
end function |
FB strings direkt zurückgeben scheidet leider komplett aus, weil dabei immer ein temporärer Deskriptor benutzt wird.
Edit: Dieser 3. work-around mit String Ptr wird wohl auch laufen, ist schneller als der Zstring Ptr:
Code: | '' String Ptr anstatt String zurückgeben
function foo( ) as string ptr export
static as string result
result = "foo"
function = @result
end function |
|
|
Nach oben |
|
|
hge2001
Anmeldungsdatum: 26.02.2008 Beiträge: 18
|
Verfasst am: 18.05.2012, 16:54 Titel: |
|
|
dkl hat Folgendes geschrieben: | Edit: Dieser 3. work-around mit String Ptr wird wohl auch laufen, ist schneller als der Zstring Ptr:
Code: | '' String Ptr anstatt String zurückgeben
function foo( ) as string ptr export
static as string result
result = "foo"
function = @result
end function |
|
Vielen Dank für die Unterstüzung von "höchster Stelle".
Workaround 3 leuchtet auch mir - als kein Compiler Spezialist - ein .
Wenn mir auch etwas grummelig wird, wenn ich mir vorstelle, dass der Pointer von der . exe in die .dll verweist.
Static ist hier das Zauberwort, weil es die (Wieder)Anlage von flüchtigen strings verhindert. Ich hoffe, dass ich das richtig verstanden habe.
Gruss
hge |
|
Nach oben |
|
|
|