Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
rexxitall
Anmeldungsdatum: 10.09.2007 Beiträge: 12 Wohnort: Hildesheim
|
Verfasst am: 09.02.2018, 12:52 Titel: FBC64 Rückgabe String Funktion an VB.NET Aufruf |
|
|
Hi
Ich verzweifele gerade an dem eigentlich durchaus trivialen Versuch String Funktionen mit Rückgabewert zu schreiben
ACHTUNG: alles 64 BIT !!!
sowas wie
function S(x as string) as string
return x & "blah"
end function.
Der Haken, diese Funktion sitzt in einer DLL welche ich aus VB.NET (64 bit Assembly) aufrufen möchte
Soetwas in eine SUB reinzubekommen funktioniert recht simpel: *öhm*
Aufruf in VB.NET z.B. mit
Declare Auto Sub OBOX2 Lib "D:\FREEBASIC\Projects\fbnet\fbnet.dll" (ByVal s As String)
Public Sub OBOX2(Byval s As WString Ptr ) Export
OBOX( *s & "Freebasic ist cool")
Dim As Integer iResult
iResult = MessageBox(0, S, "MSG",MB_YESNO Or MB_ICONQUESTION Or MB_DEFBUTTON2 or MB_SYSTEMMODAL)
End Sub
Message Box kommt wie erwartet.
Aber wehe man will Werte zurück übertragen bekommen. :/
Vielleicht hat ja schon mal jemand sich an soetwas versucht und kann mir etwas Beispiel Code zukommen lassen
Lieben Gruß
Thomas _________________ Hang on to your dreams and get rid all the assholes
J.D. Ballard |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4686 Wohnort: ~/
|
Verfasst am: 09.02.2018, 14:41 Titel: |
|
|
Wenn du die Funktion in einer DLL innerhalb einer anderen Programmiersprache verwenden willst, fürchte ich, dass du keinen FreeBSIC-STRING verwenden kannst. Das ist ein interner Datentyp, der in dieser Form anderswo nicht existiert (vermutlich verwendet auch VB intern eine andere Verwaltung). Wenn ich das richtig sehe, überträgst du von VB aus einen WSTRING PTR, der dann von FreeBASIC automatisch in das passende STRING-Format umgewandelt wird (in diese Richtung kein Problem). Wenn aber FreeBASIC einen String zurückgibt, kann dieser von einer anderen Programmiersprache nicht automatisch in einen ZSTRING o. ä. umgewandelt werden.
Funktioniert es, wenn du stattdessen einen ZSTRING PTR zurückgibst? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
rexxitall
Anmeldungsdatum: 10.09.2007 Beiträge: 12 Wohnort: Hildesheim
|
Verfasst am: 09.02.2018, 15:32 Titel: Z String Ptr |
|
|
Hi,
Zstring PTR habe ich auch versucht.
Das die FB strings nicht funktionieren ist mir auch klar,
Wenn die täten, gäb es das Problem ja nicht
IN VBA gehts mit BSTR aber na klar musste M$ ja sich für .net ne neue Schikane einfallen lassen ... Bei sowas kannst verzweifeln. Ist ja nicht so, das ich erst seit gestern programmiere *lacht* eher seit Jahrzehnten. Und dann kommt sowas und du steht wie Ochs vorm Berg.
Lieben Gruß Thomas _________________ Hang on to your dreams and get rid all the assholes
J.D. Ballard |
|
Nach oben |
|
 |
rexxitall
Anmeldungsdatum: 10.09.2007 Beiträge: 12 Wohnort: Hildesheim
|
Verfasst am: 13.02.2018, 09:23 Titel: |
|
|
Hi mit Hilfe von ST_W aus dem Chat sind wir auf folgende Variante gestossen.
Die hat allerdings ein paar Schönheitsfehler. Sie benötigt ein zeitintensives Marshalling in .NET und und die Memallocation ist auch nicht wirklich prickelnd. Wenn ich mir dazu noch UDTs ansehe oder wie man Strings in diese verfrachtet schwant mir böses :/ Aber vielleicht hat der eine oder andere ja ne grelölere Idee auf Lager wenn er den Code Sieht.
Lieben Gruß Thomas
Code: | Extern "windows-ms"
sub freemem(p as any ptr) export
deallocate(p)
end Sub
Function s2zsp (s As String ) As ZString Ptr
Dim As ZString Ptr pstr
pstr = Allocate( len(s) * SizeOf(ZString) )
*pstr = S
Return pstr
End Function
Function getstr(Byval si As ZString Ptr) As ZString Ptr Export
dim s as string
Return s2zsp(UCase (*si))
End Function
'end extern
and VB.net:
Imports System
Imports System.Runtime.InteropServices
Module Module1
<DllImport("D:\FREEBASIC\Projects\fbnet\fbnet.dll", EntryPoint:="freemem")>
Sub freemem_native(p As IntPtr)
End Sub
<DllImport("D:\FREEBASIC\Projects\fbnet\fbnet.dll", EntryPoint:="getstr")>
Function getstr_native(ByVal s As String) As IntPtr
End Function
Function FBSTR(strptr As IntPtr) As String
Dim s As String = Marshal.PtrToStringAnsi(strptr)
freemem_native(strptr)
Return s
End Function
Function getstr() As String
Dim strptr As IntPtr = getstr_native("asaa")
Dim s As String = Marshal.PtrToStringAnsi(strptr)
freemem_native(strptr)
Return s
End Function
Sub Main()
Console.WriteLine("from FreeBasic: " & FBSTR(getstr_native("123456hjk")))
Console.ReadKey()
End Sub
end module |
_________________ Hang on to your dreams and get rid all the assholes
J.D. Ballard |
|
Nach oben |
|
 |
|