FreeBASIC DLL Rückgabe String

  • wie bekomm ich ein string return von einer freebasic dll in autoit angezeigt so hat es leider nicht geklappt:

    Code
    extern "Windows-MS"
    
    
    function Text() as string export
        return "Text"
    end function
    
    
    end extern
    [autoit]

    $dll = DllOpen("Test.dll")
    $result = DllCall($dll,"wstr","Text")
    MsgBox(0,"",$result[0])

    [/autoit]

    Einmal editiert, zuletzt von gem (8. Oktober 2012 um 15:04)

  • Hi,

    so etwa ? (ungetestet)

    Code
    extern "Windows-MS"
    
    
    function Text(byref sText as string) as long export
    	sText = "Text" 
    	return len(sText)
    end function
    
    
    end extern
    [autoit]

    $sText = ""
    $dll = DllOpen("Test.dll")
    $result = DllCall($dll,"long","Text", "str*", $sText)
    MsgBox(0,"",StringFormat ("Text: %s\nTextlänge: %d", $sText, $result[0]))

    [/autoit]


    Gruß
    Greenhorn


  • Ich mach das meistens so:

    Code
    Extern "Windows-MS"
    
    
    Function Text(zText As ZString Ptr)As UInteger Export
        *zText = "Text"
        Return Len(*zText)
    End Function
    
    
    End Extern
    [autoit]

    $hDll = DllOpen("Test.dll")
    $tText = DllStructCreate("char[256];")
    $aResult = DllCall($hDll, "uint", "Text", "ptr", DllStructGetPtr($tText))
    MsgBox(0, "", "Text: " & DllStructGetData($tText, 1) & @CRLF & "Len: " & $aResult[0])

    [/autoit]

    E


    Edit: Alternativ hätte ich ncoh diese Lösung anzubieten:

    Code
    Extern "Windows-MS"
    
    
    Function Text()As ZString Ptr Export
    	Return @"Text"
    End Function
    
    
    End Extern
    [autoit]

    $hDll = DllOpen("Test.dll")

    [/autoit][autoit][/autoit][autoit]

    $aResult = DllCall($hDll, "ptr", "Text")
    MsgBox(0, "", _GetStringFromPointer($aResult[0]))

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _GetStringFromPointer($pPtr)
    Local $aResult = DllCall("kernel32.dll", "int", "lstrlen", "ptr", $pPtr)
    If @error Or Not IsArray($aResult) Then Return SetError(1, 1, False)
    Local $iLen = $aResult[0]
    Local $tString = DllStructCreate("char[" & ($iLen + 1) & "];", $pPtr)
    Return DllStructGetData($tString, 1)
    EndFunc

    [/autoit]
  • Wenn du in FreeBasci ZString Ptr verwendest, dann kannst du in AutoIt als Typ "str" verwenden ohne _GetStringFromPointer.

  • Wenn du in FreeBasci ZString Ptr verwendest, dann kannst du in AutoIt als Typ "str" verwenden ohne _GetStringFromPointer.

    Hahaha!
    Das ist wieder mal typisch für mich 8o

    Hier also die einfache Lösung :thumbup: :

    Code
    Extern "Windows-MS"
    
    
    Function Text()As ZString Ptr Export
    	Return @"Text"
    End Function
    
    
    End Extern
    [autoit]

    $hDll = DllOpen("Test.dll")

    [/autoit][autoit][/autoit][autoit]

    $aResult = DllCall($hDll, "str", "Text")
    MsgBox(0, "", $aResult[0])

    [/autoit]
  • Übrigens, wenn du den String dynamisch zusammenbauen willst, dann musst du den String in einer globalen (oder statischen) Variable zwischenspeichern bis AutoIt ihn in seine eigene Variable kopiert hat. Am einfachsten geht das so (String bleibt bis zum nächsten Funktionsaufruf erhalten)

  • Hey, ich grabe den Thread mal aus weil ich nicht weiter komme :/
    Habe in einer Variable einen String gespeichert und möchte diesen zurück geben.
    Leider hat bisher nichts geholfen. Habe sämtliche Datentypen probiert und auch eine Struktur verwendet.
    Alles erfolglos...

    Bisher habe ich hier folgendes:

    Code
    Extern "Windows-MS"
    
    
    	Function back As ZString Ptr Export
    		Dim As String s = "ABC"
    		Return StrPtr(s)
    	End Function
    
    End Extern
    [autoit]

    $ret = DllCall('code.dll', 'str', 'back')[0]
    ConsoleWrite($ret & @CRLF)

    [/autoit]

    Als Rückgabewert erhalte ich immer ein "Ä". Ich weiß nicht mehr weiter ^^
    Ich möchte aber auch nicht eine weitere Variable ByRef übergeben.
    Das möchte ich sogut wie es geht vermeiden.

    Hat jemand vielleicht eine Idee?

  • Die Variable wird beim Beenden der Funktion gelöscht.

    Entweder du deklarierst die Variable außerhalb der Funktion:

    Oder zu reservierst den Speicher zuvor in AutoIt - das wäre dann die ByRef-Methode

    E