dll aus C in vb.net aufrufen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 129 Antworten in diesem Thema. Der letzte Beitrag () ist von tron25.

    Dass Newlines durch Leerzeichen ersetzt werden, wird vermutlich an der Library liegen. Alle unbekannten Zeichen werden offenbar zu Leerzeichen. Die Lösung ist einfach: Übersetze jede Zeile einzeln:

    VB.NET-Quellcode

    1. For Each line In SourceTextbox.Text.Split(...)
    2. DestinationTextbox.AppendText(Translate(line) & Environment.NewLine)
    3. Next

    Gruß
    hal2000
    Ich habe die For-Schleife folgendermaßen angepaßt:

    VB.NET-Quellcode

    1. For Each Zeile In UngekuerztText.Text.Split(vbNewLine)
    2. GekuerztText.AppendText(LouTranslator.Translate(Zeile) & Environment.NewLine)
    3. GekuerztText.AppendText(Asc(Mid(Zeile, 1, 1)))
    4. Next


    Wenn ich jetzt den Text

    hallo
    welt

    übersetzen lasse, kommt folgendes dabei heraus:

    haqo
    104 wyt
    10

    Die 104 ist das "h" aus der ersten Zeile und die 10 ist das "VBLf" des Zeilenumbruchs. Als Trennzeichen im "Split" habe ich folgendes testweise eingesetzt:
    enviroment.newline, vbnewline, vbcrlf, vbcr & vblf, chr(13) & chr(10)

    Leider bekomme ich überall das Gleiche Ergebnis.
    Es funktioniert. Allerdings fängt jede Zeile nach einem Zeilenumbruch mit einem Leerzeichen an. Kann das evtl. daran liegen, daß am Anfang jeder neuen Zeile ein unsichtbares VBLF steht? Dann müßte ich die Funktion so anpassen, daß nur alle sichtbaren Zeichen übersetzt werden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tron25“ ()

    @tron25 Kannst Du ein kleines Projekt hochladen, das Deinen Effekt reproduziert?
    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 Nutze die Funktionalität der Textbox:

    VB.NET-Quellcode

    1. For Each Zeile In TextBox1.Lines 'Text.Split(vbNewLine)
    2. ' ...
    3. 'TextBox2.AppendText(Asc(Mid(Zeile, 1, 1))) ' ggf. weglassen
    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!
    Guten Morgen

    Hast du die Textbox2 auch gecleart zum Beispiel so

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    5. Application.Exit()
    6. End Sub
    7. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    8. Me.TextBox2.Clear()
    9. For Each Zeile In Me.TextBox1.Lines
    10. Me.TextBox2.AppendText(LouTranslator.Translate(Zeile) & Environment.NewLine)
    11. Next
    12. End Sub
    13. End Class


    Sollte funktionieren

    Freundliche Grüsse

    exc-jdbi
    Hallo nochmal,

    heute habe ich ein Update von LibLouis heruntergeladen. Leider habe ich nicht das gewünschte Ergebnis erhalten. Da habe ich die alte und neue Funktion in der DLL verglichen.

    In der alten steht:

    int EXPORT_CALL lou_translateString
    (const char *tableList,
    const widechar *inbuf,
    int *inlen,
    widechar * outbuf,
    int *outlen, char *typeform, char *spacing, int mode);

    Die neue lautet:


    int EXPORT_CALL lou_translateString(const char *tableList,
    const widechar *inbuf, int *inlen,
    widechar *outbuf, int *outlen,
    formtype *typeform, char *spacing,
    int mode);

    Der einzige Unterschied besteht bei der Deklaration von "Typeform". Was muß ich ändern, um aus einem "char" ein "typeform" zu machen?

    tron25 schrieb:

    formtype *typeform,
    formtype könnte eine Struktur sein, deren Deklaration muss in einem C-Header stehen.
    Duiese Deklaration musst Du nach .NET portieren.
    Wenn Du sie gefunden hast, poste sie mal.
    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!
    Hier die Definition:Hier die Definition:

    C#-Quellcode

    1. typedef enum {
    2. plain_text = 0x0000,
    3. italic = 0x0001, // emph_1
    4. underline = 0x0002, // emph_2
    5. bold = 0x0004, // emph_3
    6. emph_4 = 0x0008,
    7. emph_5 = 0x0010,
    8. emph_6 = 0x0020,
    9. emph_7 = 0x0040,
    10. emph_8 = 0x0080,
    11. emph_9 = 0x0100,
    12. emph_10 = 0x0200,
    13. computer_braille = 0x0400,
    14. no_translate = 0x0800,
    15. no_contract = 0x1000,
    16. // unused 0x2000,
    17. // used by syllable 0x4000,
    18. // used by syllable 0x8000
    19. } typeforms;
    20. #define comp_emph_1 italic
    21. #define comp_emph_2 underline
    22. #define comp_emph_3 bold


    Hier noch die ".h"-Dateien
    @tron25 Dies hier:

    VB.NET-Quellcode

    1. Public Enum typeforms
    2. plain_text = &H0
    3. italic = &H1 ' emph_1
    4. underline = &H2 ' emph_2
    5. bold = &H4 ' emph_3
    6. emph_4 = &H8
    7. emph_5 = &H10
    8. emph_6 = &H20
    9. emph_7 = &H40
    10. emph_8 = &H80
    11. emph_9 = &H100
    12. emph_10 = &H200
    13. computer_braille = &H400
    14. no_translate = &H800
    15. no_contract = &H1000
    16. End Enum
    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!
    Ich habe die den Code eingefügt und folgende Zeile angepaßt:

    VB.NET-Quellcode

    1. NativeMethods.lou_translateString(Programmverzeichnis & "\Braille\Brailletabellen\" & AktuelleUebersetzungstabelle, input, input.Length, buffer, refLength, typeforms.Plain_text, Nothing, 0)


    Leider bekomme ich kein Ergebnis. Ich vermute, daß ich die folgende Zeile ebenfalls anpassen muß:

    VB.NET-Quellcode

    1. <MarshalAs(UnmanagedType.LPStr)> typeform As String,
    @tron25 Da muss dann typeform As typeforms stehen.
    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!
    das MarshalAs gehört da natürlich nicht hin, ist ja schließlich kein String...
    Außerdem muss das enum die größe eines Bytes haben, und es ist ein out oder ref parameter
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich habe die Zeile angepaßt:

    VB.NET-Quellcode

    1. Byref typeform as typeforms,


    Wie kann ich festlegen, daß das typeform nur ein Byte groß ist?

    Ist die aufrufende Zeile syntaktisch korrekt?

    VB.NET-Quellcode

    1. NativeMethods.lou_translateString(Programmverzeichnis & "\Braille\Brailletabellen\" & AktuelleUebersetzungstabelle, input, input.Length, buffer, refLength, typeforms.Plain_text, Nothing, 0)

    jvbsl schrieb:

    Außerdem muss das enum die größe eines Bytes haben
    Das passt hicht:

    tron25 schrieb:

    C-Quellcode

    1. no_contract = 0x1000,

    @tron25 Lass es so und probiere aus, ob es geht.
    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!