Funktion aus eigener DLL (Freebasic) lässt sich nicht aufrufen

  • Hallo, ich kann aus Autoit heraus leider nicht auf eine Funktion meiner Freebasic-DLL zugreifen.

    Freebasic-Code:

    Spoiler anzeigen
    Code
    Declare function bla Lib "dlltest" Alias "bla" () As String
    Function bla() As String Export
    	return "blub"
    End Function

    Die entstandene DLL lässt sich in Freebasic problemlos nutzen.

    Autoit-Code:

    [autoit]

    $res = DllCall("dlltest.dll", "str", "bla")

    [/autoit]

    @error steht dann auf 3, was ja heißt dass die Funktion nicht gefunden wurde.
    Lässt sich da was machen?

    2 Mal editiert, zuletzt von Lava (20. Dezember 2009 um 17:26)

  • Freebasic hängt an jeden Funktionsnamen noch ein @## dran (## ist die Länge der Parameter in Bytes)
    Den Namen kannst du dann z.B. mit DEE rausfinden.

  • Ok, dank dem erweitertem Namen kann ich die Funktion jetzt aufrufen.
    Rückgabe ist bei Zahlen auch kein Problem, nur bei Strings (str oder wstr) sieht die dann so aus: "@!!(zufälliges Ascii-Zeichen)", unabhängig vom eigentlichen Wert.

    [autoit]

    #include <Array.au3>
    $res = DllCall("dlltest.dll", "str", "bla@0")
    _arraydisplay($res)

    [/autoit]

    Hier ist die DLL:

  • Du musst eine globale Variable erstellen, die den String zwischenspeichert, bis du ihn in AutoIt hast. Außerdem ist der StringTyp in Freebasic nicht gleich ein "str" im DLLCall. Du musst explizit den Pointer auf den String zurückgeben:

    Spoiler anzeigen
    Code
    Dim Shared buffer As String
    Declare Function      bla Lib "test" Alias "bla" () As Any Ptr
    
    
    Function bla() As Any Ptr Export
    	buffer = "blub"
    	return StrPtr(buffer)
    End Function
    [autoit]

    $ret = DllCall("test.dll", "str", "bla@0")
    MsgBox(0, '', $ret[0])

    [/autoit]
  • Danke, funktioniert perfekt!

    Nachtrag:

    Moment, eine Sache ist da noch: Wie übergebe ich der Funktion jetzt einen String?