dll aus C in vb.net aufrufen
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 129 Antworten in diesem Thema. Der letzte Beitrag () ist von tron25.
-
-
@tron25 Häng mal das aktuelle Projekt mit der neuen DLL an (Bitte keine Zwischenstände).Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
@tron25 Kannst SDu parallel dazu noch die alte Version bedienen?
Ich weiß jetzt nicht, was da rauskommen soll.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
@tron25 "Wochenende" bringt "ⷌ愼ս"Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Schaut man sich github.com/liblouis/liblouis/b…er/liblouis/liblouis.h.in an, fällt sofort der Unterschied zwischen
und
auf. Die Enumerationtypeforms
dient lediglich dazu, den Parametertypeform
vom Typformtype*
elegant formulieren zu können. Laut Dokumentation ist das ein Arrayparameter mit dynamischer Größe:
It is an array of formtype with the same length as the input buffer pointed to by *inbuf.
Die neue Signatur der DLL-Funktion istlou_translateString(const char*, const widechar*, int*, widechar*, int*, formtype*, char*, int)
.
Die verwaltete Deklaration muss daher lauten:
VB.NET-Quellcode
- 'int EXPORT_CALL lou_translateString
- '(const char *tableList,
- ' const widechar *inbuf,
- ' int *inlen,
- ' widechar * outbuf,
- ' int *outlen,
- ' formtype *typeform,
- ' char *spacing,
- ' int mode);
- <DllImport("liblouis-3.dll")>
- Public Shared Function lou_translateString(
- <MarshalAs(UnmanagedType.LPStr)> tableList As String,
- <MarshalAs(UnmanagedType.LPWStr)> inbuf As String,
- ByRef inlen As Int32,
- <MarshalAs(UnmanagedType.LPWStr), Out()> outbuf As StringBuilder,
- ByRef outlen As Int32,
- typeform() As Typeforms,
- <MarshalAs(UnmanagedType.LPStr)> spacing As String,
- mode As Int32) As Int32
- End Function
- Public Enum Typeforms As UShort
- plain_text = &H0
- italic = &H1 ' emph_1
- underline = &H2 ' emph_2
- bold = &H4 ' emph_3
- emph_4 = &H8
- emph_5 = &H10
- emph_6 = &H20
- emph_7 = &H40
- emph_8 = &H80
- emph_9 = &H100
- emph_10 = &H200
- computer_braille = &H400
- no_translate = &H800
- no_contract = &H1000
- End Enum
Das Array wird automatisch in beide Richtungen gemarshallt. Der unverwaltete Pointer ist letztlich einunsigned short*
, weil die Enumeration mitAs UShort
deklariert wurde.
Der Aufruf sieht so aus (Auszug):
VB.NET-Quellcode
- ' [...]
- Dim buffer As New StringBuilder(refLength)
- Dim typeform() = Enumerable.Repeat(NativeMethods.Typeforms.plain_text, refLength).ToArray()
- NativeMethods.lou_translateString("tables\de-de-g2.ctb", input, input.Length, buffer, refLength, typeform, Nothing, 0)
- ' Limit stringBuilder size in case of implicit memory reallocation
- ' [...]
Das funktioniert aber noch nicht, weil die neue Version der DLL auch neue Tabellen benötigt. Vergleiche z.B. die Versionen der Dateide-g0-core.uti
, dann siehst du den Unterschied. Die "emphasis opcodes" haben sich unter anderem geändert. Abhilfe: Lade die neuen Tabellen vom GitHub-Projekt.
Sehr hilfreich ist übrigens auch diese Funktion:
Gruß
hal2000
-
Ich habe die Änderungen durchgeführt. Nun bekomme ich folgende Fehlermeldung:
Fehler BC32050 Der TResult-Typparameter für "Public Shared Overloads Function Repeat(Of TResult)(element As TResult, count As Integer) As IEnumerable(Of TResult)" kann nicht per Rückschluss abgeleitet werden.
Das Programm markiert folgende Zeile:
-
Gruß
hal2000
-
Ich habe nun den Code erneut eingefügt:
VB.NET-Quellcode
- Public Class Form1
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- End
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- For Each Zeile In TextBox1.Text.Split(vbNewLine)
- Dim res = LouTranslator.Translate(Zeile)
- TextBox2.AppendText(res)
- TextBox2.AppendText(Environment.NewLine)
- Next
- ' For Each Zeile In TextBox1.Text.Split(vbNewLine)
- ' TextBox2.AppendText(LouTranslator.Translate(Zeile) & Environment.NewLine)
- ' Next
- End Sub
- End Class
und
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports System.Text
- Public Enum Typeforms As UShort
- plain_text = &H0
- italic = &H1 ' emph_1
- underline = &H2 ' emph_2
- bold = &H4 ' emph_3
- emph_4 = &H8
- emph_5 = &H10
- emph_6 = &H20
- emph_7 = &H40
- emph_8 = &H80
- emph_9 = &H100
- emph_10 = &H200
- computer_braille = &H400
- no_translate = &H800
- no_contract = &H1000
- End Enum
- Public Class LouTranslator
- Public Shared Function Translate(input As String) As String
- ' If String.IsNullOrEmpty(input) Then
- ' Throw New ArgumentNullException("input")
- ' End If
- Dim refLength As Int32 = input.Length + 32 ' size heuristic
- Dim buffer As New StringBuilder(refLength)
- Dim typeform() As NativeMethods.Typeforms = Enumerable.Repeat(Of NativeMethods.Typeforms)(NativeMethods.Typeforms.plain_text, refLength).ToArray()
- ' Limit stringBuilder size in case of implicit memory reallocation
- buffer.Length = refLength
- Return buffer.ToString()
- End Function
- End Class
- Public Class NativeMethods
- 'int EXPORT_CALL lou_translateString
- '(const char *tableList,
- ' const widechar *inbuf,
- ' int *inlen,
- ' widechar * outbuf,
- ' int *outlen,
- ' formtype *typeform,
- ' char *spacing,
- ' int mode);
- <DllImport("liblouis.dll")>
- Public Shared Function lou_translateString(
- <MarshalAs(UnmanagedType.LPStr)> tableList As String,
- <MarshalAs(UnmanagedType.LPWStr)> inbuf As String,
- ByRef inlen As Int32,
- <MarshalAs(UnmanagedType.LPWStr), Out()> outbuf As StringBuilder,
- ByRef outlen As Int32,
- typeform() As Typeforms,
- <MarshalAs(UnmanagedType.LPStr)> spacing As String,
- mode As Int32) As Int32
- End Function
- End Class
Es erscheint immernoch die gleiche Fehlermeldung. -
@tron25 Hör auf mit dem LINQ, bau Dir die Liste zu Fuß zusammen!Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
@tron25 Dies:
Enumerable.Repeat(...)
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Die Enumeration "Typeforms" gehört in die Klasse NativeMethods - bei dir steht sie außerhalb.
Spoiler anzeigen
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports System.Text
- Module Module1
- Sub Main()
- Dim result = LouTranslator.Translate("Wochenende")
- End Sub
- End Module
- Class LouTranslator
- Public Shared Function Translate(input As String) As String
- If String.IsNullOrEmpty(input) Then
- Throw New ArgumentNullException("input")
- End If
- Dim refLength As Int32 = input.Length + 32 ' size heuristic
- Dim buffer As New StringBuilder(refLength)
- Dim typeform() = Enumerable.Repeat(NativeMethods.Typeforms.plain_text, refLength).ToArray()
- NativeMethods.lou_translateString("tables\de-de-g2.ctb", input, input.Length, buffer, refLength, typeform, Nothing, 0)
- ' Limit stringBuilder size in case of implicit memory reallocation
- buffer.Length = refLength
- Return buffer.ToString()
- End Function
- End Class
- Class NativeMethods
- 'int EXPORT_CALL lou_translateString
- '(const char *tableList,
- ' const widechar *inbuf,
- ' int *inlen,
- ' widechar * outbuf,
- ' int *outlen,
- ' formtype *typeform,
- ' char *spacing,
- ' int mode);
- <DllImport("liblouis-3.dll")>
- Public Shared Function lou_translateString(
- <MarshalAs(UnmanagedType.LPStr)> tableList As String,
- <MarshalAs(UnmanagedType.LPWStr)> inbuf As String,
- ByRef inlen As Int32,
- <MarshalAs(UnmanagedType.LPWStr), Out()> outbuf As StringBuilder,
- ByRef outlen As Int32,
- typeform() As Typeforms,
- <MarshalAs(UnmanagedType.LPStr)> spacing As String,
- mode As Int32) As Int32
- End Function
- Public Enum Typeforms As UShort
- plain_text = &H0
- italic = &H1 ' emph_1
- underline = &H2 ' emph_2
- bold = &H4 ' emph_3
- emph_4 = &H8
- emph_5 = &H10
- emph_6 = &H20
- emph_7 = &H40
- emph_8 = &H80
- emph_9 = &H100
- emph_10 = &H200
- computer_braille = &H400
- no_translate = &H800
- no_contract = &H1000
- End Enum
- End Class
Gruß
hal2000
-
Vielen Dank. Es funktioniert jetzt.
Hier nochmal der angepaßte Code:
Die aufrufende Funktion:
Und hier, der Code in der LibLouis-Klasse:
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports System.Text
- Class LouTranslator
- Public Shared Function Translate(input As String) As String
- If String.IsNullOrEmpty(input) Then
- Throw New ArgumentNullException("input")
- End If
- Dim refLength As Int32 = input.Length + 32 ' size heuristic
- Dim buffer As New StringBuilder(refLength)
- Dim typeform() = Enumerable.Repeat(NativeMethods.Typeforms.plain_text, refLength).ToArray()
- NativeMethods.lou_translateString("Braille\Brailletabellen\de-de-g2.ctb", input, input.Length, buffer, refLength, typeform, Nothing, 0)
- ' Limit stringBuilder size in case of implicit memory reallocation
- buffer.Length = refLength
- Return buffer.ToString()
- End Function
- End Class
- Class NativeMethods
- 'int EXPORT_CALL lou_translateString
- '(const char *tableList,
- ' const widechar *inbuf,
- ' int *inlen,
- ' widechar * outbuf,
- ' int *outlen,
- ' formtype *typeform,
- ' char *spacing,
- ' int mode);
- ' <DllImport("liblouis.dll")>
- <DllImport("liblouis.dll", BestFitMapping:=True, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Unicode)>
- Public Shared Function lou_translateString(
- <MarshalAs(UnmanagedType.LPStr)> tableList As String,
- <MarshalAs(UnmanagedType.LPWStr)> inbuf As String,
- ByRef inlen As Int32,
- <MarshalAs(UnmanagedType.LPWStr), Out()> outbuf As StringBuilder,
- ByRef outlen As Int32,
- typeform() As Typeforms,
- <MarshalAs(UnmanagedType.LPStr)> spacing As String,
- mode As Int32) As Int32
- End Function
- Public Enum Typeforms As UShort
- plain_text = &H0
- italic = &H1 ' emph_1
- underline = &H2 ' emph_2
- bold = &H4 ' emph_3
- emph_4 = &H8
- emph_5 = &H10
- emph_6 = &H20
- emph_7 = &H40
- emph_8 = &H80
- emph_9 = &H100
- emph_10 = &H200
- computer_braille = &H400
- no_translate = &H800
- no_contract = &H1000
- End Enum
- End Class
Vielen Dank nochmal an Alle.
-
Ähnliche Themen
-
Adresse von einem Prozess aufrufen
SanDMann016 - - Sonstige Problemstellungen