String Übergabe bei Einsprungpunkt-DLL VB6 immer als Unicode?

  • VB6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von jacky.

    String Übergabe bei Einsprungpunkt-DLL VB6 immer als Unicode?

    Hallo,

    ich habe eine VB6 dll – Datei mit Einsprungpunkten erstellt nach der Vorlage:
    activevb.de/tutorials/tut_eins…ll/einsprungpunktdll.html

    Soweit
    klappt das jetzt auch. Aber ich wundere mich, warum übergebene Strings
    zur dll als Unicode (2 Byte ASCII-Zeichen) und auch zurück wieder als
    Unicode kommen?

    Sowohl die dll wurde mit VB6 erstellt als auch das
    Programm, welches die dll nutzt ist in VB6 geschrieben, also eigentlich
    gleiche Systeme?
    Tritt sowohl unter Win7 (32bit) als auch WinXP auf.

    Ich muss dann entsprechend mit
    Str_Unicode = StrConv(Str_ASCII, vbUnicode)
    in Unicode wandeln und damit die dll aufrufen, oder zurück mit
    Str_ASCII = Replace$(Str_Unicode, vbNullChar, "")
    oder
    Str_ASCII = StrConv(Str_Unicode, vbFromUnicode)
    wieder in den ASCII-String wandeln.

    Hat jemand das gleiche Verhalten festgestellt?
    Woran kann das liegen?

    Danke im Voraus für Ihre Hilfe!

    Viele Grüße,
    Daniel
    Nachdem mir klar ist, dass VB6 generell Strings als Unicode oder UTF-16 darstellt, habe ich eine neue Test - dll erstellt mit folgender Funktion:

    Visual Basic-Quellcode

    1. Public Function Proc1(ByVal P_Nr As Integer, ByVal P_Str_In As String, ByRef P_Str_Out As String) As Integer
    2. P_Str_Out = StrConv(P_Str_In, vbUnicode) & ": " & P_Nr
    3. P_Str_Out = StrConv(P_Str_Out, vbFromUnicode)
    4. End Function


    Diese rufe ich dann in einem Testprojekt wie folgt auf

    Visual Basic-Quellcode

    1. Private Declare Function Proc1 Lib "DLL_Test1.dll" (ByVal P_Nr As Integer, ByVal P_Str_In As String, ByRef P_Str_Out As String) As Integer
    2. Private Sub Command1_Click()
    3. Dim Ret_Str As String
    4. Dim Ret_Val As Integer
    5. Ret_Val = Proc1(5, "Test8", Ret_Str)
    6. Debug.Print Ret_Val & ": " & Ret_Str & vbCrLf & Str_To_ASCII(Ret_Str)
    7. End Sub


    Ausgabe:
    54 65 73 74 38 3A 20 35

    Es scheint, dass an die dll übergebene Strings als UTF-8 übergeben werden und neue Strings generell UTF-16 (wenn man das so nennen darf). Am Ende müsste wieder mit StrConv() auf UTF-8 gewandelt werden.
    Eine C++ - dll würde wohl generell die Strings als UTF-8 bzw. 1 Byte ASCII - Werte lesen, verarbeiten, ausgeben. Bei VB6 sind das immer 2 - Byte Werte was die Sache unschön macht.

    Ich finde das ziemlich umständlich, dass man bei einer größeren dll-Datei nun alle Strings anpassen bzw. richtig konvertieren müsste, damit nach außen immer mit 1-Byte Strings übergeben wird.
    Gibt es eine Möglichkeit bei VB6 global auf 1-Byte-Strings zu wechseln? Oder gibt es eine elegante Lösung, um nicht alle Strings hin- und her konvertieren zu müssen?

    Viele Grüße,
    Daniel

    Es scheint, dass an die dll übergebene Strings als UTF-8 übergeben werden
    Mit Sicherheit nicht.

    Warum nicht? Bzw. wieso muss ich den übergebenen String mit dem neuen Teil wie folgt zusammenfügen, damit nachher alles in "unicode" ist:

    Visual Basic-Quellcode

    1. P_Str_Out = StrConv(P_Str_In, vbUnicode) & ": " & P_Nr



    Eine C++ - dll würde wohl generell die Strings als UTF-8 bzw. 1 Byte ASCII -
    Auch nicht UTF8.

    Was dann? Was ist der Standard?