wie bekomm ich ein string return von einer freebasic dll in autoit angezeigt so hat es leider nicht geklappt:
[autoit]$dll = DllOpen("Test.dll")
$result = DllCall($dll,"wstr","Text")
MsgBox(0,"",$result[0])
wie bekomm ich ein string return von einer freebasic dll in autoit angezeigt so hat es leider nicht geklappt:
[autoit]$dll = DllOpen("Test.dll")
$result = DllCall($dll,"wstr","Text")
MsgBox(0,"",$result[0])
Hi,
so etwa ? (ungetestet)
extern "Windows-MS"
function Text(byref sText as string) as long export
sText = "Text"
return len(sText)
end function
end extern
$sText = ""
$dll = DllOpen("Test.dll")
$result = DllCall($dll,"long","Text", "str*", $sText)
MsgBox(0,"",StringFormat ("Text: %s\nTextlänge: %d", $sText, $result[0]))
Gruß
Greenhorn
Ich mach das meistens so:
Extern "Windows-MS"
Function Text(zText As ZString Ptr)As UInteger Export
*zText = "Text"
Return Len(*zText)
End Function
End Extern
$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])
E
Edit: Alternativ hätte ich ncoh diese Lösung anzubieten:
Extern "Windows-MS"
Function Text()As ZString Ptr Export
Return @"Text"
End Function
End Extern
$hDll = DllOpen("Test.dll")
[/autoit][autoit][/autoit][autoit]$aResult = DllCall($hDll, "ptr", "Text")
MsgBox(0, "", _GetStringFromPointer($aResult[0]))
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
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
Hier also die einfache Lösung :
Extern "Windows-MS"
Function Text()As ZString Ptr Export
Return @"Text"
End Function
End Extern
$hDll = DllOpen("Test.dll")
[/autoit][autoit][/autoit][autoit]$aResult = DllCall($hDll, "str", "Text")
MsgBox(0, "", $aResult[0])
Ü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)
super danke für die ganzen antworten
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:
Extern "Windows-MS"
Function back As ZString Ptr Export
Dim As String s = "ABC"
Return StrPtr(s)
End Function
End Extern
$ret = DllCall('code.dll', 'str', 'back')[0]
ConsoleWrite($ret & @CRLF)
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:
Extern "Windows-MS"
Dim Shared As String s
Function back As ZString Ptr Export
s = "ABC"
Return StrPtr(s)
End Function
End Extern
Alles anzeigen
Oder zu reservierst den Speicher zuvor in AutoIt - das wäre dann die ByRef-Methode
E
Ah, super
Vielen dank!