vb-Zentrum
Allgemeine Unicode Funktionen
http://www.vb-zentrum.de/uniallgemein.html

© 2023 vb-Zentrum

Unicode allgemein

Dieses Kapitel enthält eine Sammlung von VB6 Unicode Funktionen für die allgemeine Programmerstellung und die Programmoberfläche (GUI - Graphics User Interface). VB6 unterstützt zwar von Hause aus Unicode in Strings und String-Funktionen (Left$, Right$, Mid$, InStr, StrConv,etc.), nicht aber in den VBA Funktionen wie Command$ oder MsgBox.

Um die Unicode Implementierung so einfach wie möglich zu gestalten haben einige Funktionen den gleichen Namen, wie das VBA Original. Diese Funktionen sind im Titel mit "(VBA-Overwrite)" gekennzeichnet! Wenn Sie also die hier beschriebenen Funktionen in Ihren Code einfügen, so werden durch diese Technik die VBA Funktionen gewissermaßen überschrieben; d.h.:

Ihr Code muss nicht verändert werden und unterstützt ab sofort Unicode!

Vorbedingungen

Viele der folgenden Beispiele benutzen die globale, boolsche Variable isUnicode, sowie die Compiler Konstante #ANSISupport.

Beide sind in den folgenden Beispielen aus Platzgründen nicht enthalten und werden deshalb hier zentral beschrieben:

  • Compiler Konstante #ANSISupport
    hiermit wird projektweit entschieden, ob Ihre Anwendung auch auf Systmen vor Windows 2000 laufen soll (#ANSISupport <> 0).
    Um die ANSI Unterstützung zu aktivieren gehen Sie folgendermaßen vor:

    rufen Sie in der IDE den Dialog der Projekteigenschaften auf (Menü: "Projekt" -> "Eigenschaften von [Projektname]...")
    Wechseln Sie auf die Registerkarte "Erstellen"
    Geben Sie in das Feld "Argumente für bedingte Kompilierung" folgenden Text ein: ANSISupport = 1
  • Globale Variable isUnicode
    Wenn die Compiler Konstate #ANSISupport <> 0 ist: dann wird die ANSI Variante auf Nicht-NT-System benutzt,
    anderenfalls die UNICODE Variante.

Deshalb muss diese Variable in einem Modul angelegt werden und über folgende Funktion vor allen weiteren Aufrufen initialisiert werden:

Option Explicit

Public isUnicode As Boolean

' Deklaration:
Private Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Long

' Typendefinition:
Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type

Private Const VER_PLATFORM_WIN32_NT = 2


' Funktion:
' Prüft auf NT-Betriebssysteme: True ab Windows NT/2000 und neuer, sonst False
Public Function isSystemNT() As Boolean
  Dim info As OSVERSIONINFO

  info.dwOSVersionInfoSize = Len(info)
  GetVersionExA info
  isSystemNT = (info.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function

' Initialisierungs-Aufruf:
isUnicode = isSystemNT()

Übrigens: wenn Sie die Beispiele nicht einzelnd kopieren möchten, können Sie auch das fertige Modul vbzGlobal.bas herunterladen.
Darin ist (fast) alles enthalten, was hier zu finden ist. Benutzen Sie diese Tipp-Seite dann einfach als erweiterte Dokumentation...

Nach oben

0001 Command$ (VBA-Overwrite)

Arbeitet Ihr Programm mit Parameterübergabe, so ist die Auswertung der VBA Funktion Command$ wohl der erste Schritt in Ihrem Programmcode. Diese Funktion unterstützt leider kein Unicode, also werden wir sie überschreiben und um Unicode erweitern, denn Microsoft hält für uns VB-ler auch hier wieder die API-Lösung bereit:

  • Beachten Sie die Vorbedingungen
  • Diese Funktion ist Bestandteil des Moduls vbzGlobal.bas, das sie hier kostenlos herunterladen können.
' Context.Scope.Library command line parameters
Private Declare Function GetCommandLineW Lib "kernel32" () As Long
Private Declare Function PathGetArgsW Lib "shlwapi" (ByVal pszPath As Long) As Long
Private Declare Function SysReAllocString Lib "oleaut32" (ByVal pbString As Long, _
                                                          ByVal pszStrPtr As Long) As Long

Public Function command() As String
  If isSystemNT And Not isIDE Then
    SysReAllocString VarPtr(command), PathGetArgsW(GetCommandLineW)
  Else
    command = VBA.command$
  End If
End Function

Public Function isIDE() As Boolean
  isIDE = (App.LogMode = 0)
End Function
  • Die Unicode Variante der Funktion kann nicht in der IDE ausgeführt werden, deshalb die zusätzliche Abfrage isIDE.
 

Autor: ralf schlegel
Stand: 12/2012

Nach oben

0002 Form-Caption - Unicode in der Titelzeile

Benutzen Sie diese Funktion, um in der Titelleiste eines Fensters oder Dialogs Unicodetext anzuzeigen. Der Funktion übergeben Sie das Handle der Form, sowie den gewünschten Text.
Leider funktioniert dies erst ab Windows XP und nur bei aktiviertem Theming! Eine andere Lösung habe ich bis heute nicht gefunden.

Private Declare Function SetWindowTextA Lib "user32" (ByVal hWnd As Long, _
        ByVal lpString As String) As Long
Private Declare Function DefWindowProcW Lib "user32" (ByVal hWnd As Long, _
        ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_SETTEXT = &HC&

Public Sub formCaption(ByRef hWnd As Long, ByVal UniCaption As String)
  #If ANSISupport Then
    If isUnicode Then   ' if Unicode is available...
      DefWindowProcW hWnd, WM_SETTEXT, ByVal &H0&, ByVal StrPtr(UniCaption)
    Else                ' no Unicode for us
      SetWindowTextA hWnd, UniCaption
    End If
  #Else
    DefWindowProcW hWnd, WM_SETTEXT, ByVal &H0&, ByVal StrPtr(UniCaption)
  #End If
End Sub

 

Autor: ralf schlegel
Stand: 12/2012

Nach oben

0003 isUnicodeString vs Microsofts "IsTextUnicode"

Bevor wir einen String weiterverarbeiten ist es manchmal erforderlich zu wissen, ob er Unicode Zeichen enthält oder nicht. Microsoft bietet dafür die API Funktion IsTextUnicode, die noch so einiges mehr kann, räumt aber gleichzeitig ein, dass diese Funktion "nicht sicher" ist und auch Fehlinterpretationen möglich sind. Eine sehr einfache Alternative stellt die unten beschriebene Funktion isUnicodeString dar: wir wissen, dass VB intern alle Strings im Unicodeformat speichert. Handelt es sich dennoch um reinen ANSI Code, so ist jedes 2. Byte im String "0". Diese Tatsache machen wir uns zu nutze...

' tests, if a string contains unicode chars
Public Function isUnicodeString(ByVal uString As String) As Boolean
  Dim i As Long
  Dim b() As Byte
  
  If LenB(uString) Then
    b = uString
    For i = 1 To UBound(b) Step 2 ' check every 2nd byte
      If b(i) Then                ' if not 0...
        isUnicodeString = True    ' ... must be unicode
        Exit Function             ' do not test anymore
      End If
    Next
  End If
End Function


 

Autor: ralf schlegel
Stand: 01/2013

Nach oben