<p>Vielen Dank, es funktioniert.</p>
<p> </p>
<p>Ich habe mir das Beispiel aus Post 2 heruntergeladen und angeschaut. Ich muß zugeben, dass ich noch nicht den vollen Durchblick habe. "lou_version" gibt einen Pointer zur Version im Speicher zurück, daher wird das Ergebnis über "MarshalAs.PTRToString" in einen String umgewandelt. Allerdings habe ich ein Problem, dies auf eine Funktion mit mehreren Eingabe- und Ausgabewerten zu übertragen. So komme ich wieder auf die eigentliche Funktion zurück:</p>
<p>
</p>
<p> </p>
<p>Aus reiner Verzweifelung habe ich versucht, mit den Variablendeklarationen herumzuexperimentieren. So habe ich beispielsweise "<MarshalAs()>" durch "byRef" ersetzt und anderes ausprobiert. Tuvok hat mal gesagt: "Wenn das Mögliche ausgeschöpft ist, bleibt nur das Unmögliche übrig". Spaß bei Seite! Ich habe sogar die DLL mit "nmake" und "Clang" erneut kompiliert. Ich verstehe nicht, warum trotz gleicher Deklarationen die alte Version 3.0.0 funktioniert und die Neue nicht. Eine Idee, wie "lou_translate" bzw. "lou_translateString" verändert werden müssen?</p>
<p> </p>
<p>Ich habe mir das Beispiel aus Post 2 heruntergeladen und angeschaut. Ich muß zugeben, dass ich noch nicht den vollen Durchblick habe. "lou_version" gibt einen Pointer zur Version im Speicher zurück, daher wird das Ergebnis über "MarshalAs.PTRToString" in einen String umgewandelt. Allerdings habe ich ein Problem, dies auf eine Funktion mit mehreren Eingabe- und Ausgabewerten zu übertragen. So komme ich wieder auf die eigentliche Funktion zurück:</p>
<p>
VB.NET-Quellcode
- </p>
- <p>Imports System.Globalization<br />
- Imports System.Runtime.InteropServices<br />
- Imports System.Text<br />
- Class LibLouis<br />
- Public Shared Function Translate(Input As String) As String<br />
- Dim InputLen As Int32 = Input.Length<br />
- Dim OutputLen As Int32 = Input.Length * 32<br />
- Dim Output As New StringBuilder<br />
- Dim typeform() = Enumerable.Repeat(NativeMethods.Typeforms.plain_text, OutputLen).ToArray()<br />
- Dim Adresse = NativeMethods.lou_translateString("\braille\Brailletabellen\de-g2.ctb", Input, InputLen, Output, OutputLen, Nothing, Nothing, 0)<br />
- Dim Rueckgabe As String = Marshal.PtrToStringAnsi(Adresse)<br />
- Return Rueckgabe<br />
- End Function</p>
- <p>End Class</p>
- <p>Class NativeMethods<br />
- <DllImport("liblouis.dll", BestFitMapping:=False, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Auto)><br />
- Public Shared Function lou_version() As Integer<br />
- End Function</p>
- <p> <DllImport("liblouis.dll", BestFitMapping:=False, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Auto)><br />
- Public Shared Function lou_translateString(<br />
- <MarshalAs(UnmanagedType.LPStr)> tableList As String,<br />
- <MarshalAs(UnmanagedType.LPWStr)> inbuf As String,<br />
- ByRef inlen As Int32,<br />
- <MarshalAs(UnmanagedType.LPWStr), Out()> outbuf As StringBuilder,<br />
- ByRef outlen As Int32,<br />
- Typeform() As Typeforms,<br />
- <MarshalAs(UnmanagedType.LPStr)> spacing As String,<br />
- mode As Int32) As Integer<br />
- End Function<br />
- Public Enum TranslationModes<br />
- noContractions = 1<br />
- compbrlAtCursor = 2<br />
- dotsIO = 4<br />
- comp8Dots = 8<br />
- pass1Only = 16<br />
- compbrlLeftCursor = 32<br />
- otherTrans = 64<br />
- ucBrl = 128<br />
- End Enum</p>
- <p> Public Enum Typeforms As UShort<br />
- plain_text = &H0<br />
- italic = &H1 ' emph_1<br />
- underline = &H2 ' emph_2<br />
- bold = &H4 ' emph_3<br />
- emph_4 = &H8<br />
- emph_5 = &H10<br />
- emph_6 = &H20<br />
- emph_7 = &H40<br />
- emph_8 = &H80<br />
- emph_9 = &H100<br />
- emph_10 = &H200<br />
- computer_braille = &H400<br />
- no_translate = &H800<br />
- no_contract = &H1000<br />
- End Enum<br />
- End Class</p>
- <p>
<p> </p>
<p>Aus reiner Verzweifelung habe ich versucht, mit den Variablendeklarationen herumzuexperimentieren. So habe ich beispielsweise "<MarshalAs()>" durch "byRef" ersetzt und anderes ausprobiert. Tuvok hat mal gesagt: "Wenn das Mögliche ausgeschöpft ist, bleibt nur das Unmögliche übrig". Spaß bei Seite! Ich habe sogar die DLL mit "nmake" und "Clang" erneut kompiliert. Ich verstehe nicht, warum trotz gleicher Deklarationen die alte Version 3.0.0 funktioniert und die Neue nicht. Eine Idee, wie "lou_translate" bzw. "lou_translateString" verändert werden müssen?</p>