vb-Zentrum
Unicode
http://www.vb-zentrum.de/tip_unicode.html

© 2017 vb-Zentrum

Unicode Workshop

In diesem Kapitel finden Sie Beispiele und Lösungen für die Praxis zu den Themen:

Bevor Sie sich jedoch entschließen ein unicodefähige Anwendung zu erstellen, oder gar ein vorhandene auf Unicode
umzustellen (ich garantiere: das ist kein Zuckerschlecken) sollten Sie sich folgende Frage stellen:

Auf welchen Betriebssystemen sollen meine Anwendungen laufen?

Lautet Ihre Antwort:

  • auf Windows 2000 und neuer, so können Sie Ihren gesamten Code auf Unicode umstellen!
  • ab Windows 98, so sollten Sie zu Beginn ihres Programms die Version des Betriebssystems ermitteln und mit Hilfe einer boolschen Variablen (z.B. isUnicode) jede Funktion um die Abfrage If isUnicode Then... Else... End If erweitern.


Wenn Sie mit themenorientierten Basicmodulen arbeiten, die beide Fälle unterstützen sollen, so können Sie - mit ein bisschen mehr Tipparbeit - auch die eierlegende Wollmilchsau erstellen:

 

Öffnen Sie dazu in der IDE den Dialog "Projekteigenschaften".
Geben Sie unter der Registerkarte "Erstellen"
als "Argumente für bedingte Kompilierung" folgendes ein: ANSISupport = 1. (siehe Bild rechts)

Dadurch wird beim Compilieren (und auch in der IDE) der Codeabschnitt #If ANSISupport Then... benutzt;
dieser Abschnitt enthält ggf. zusätzlich die Abfrage isUnicode (s.o.).

 

Für reine Unicode Anwendungen setzen Sie ANSISupport = 0.

Dadurch wird beim Compilieren (und auch in der IDE) der Codeabschnitt zwischen #Else und #End If benutzt, das heißt:
- die isUnicode Abfrage entfällt
- die ANSI Codes werden nicht übersetzt
- die kompilierte Anwendung wird kleiner und schneller!


Hierzu ein kurzes Beispiel für den Quellcodeaufbau anhand der API "MessageBox"
(es wird davon ausgegangen, dass die globale Variable isUnicode bereits bei Programmstart von einer anderen Funktion ermittelt wurde):

#If ANSISupport Then
  Private Declare Function MessageBoxA Lib "user32" (ByVal hWnd As Long, ByVal lpText As String, _
          ByVal lpCaption As String, ByVal msgType As VbMsgBoxStyle) As VbMsgBoxResult
#End If
Private Declare Function MessageBoxW Lib "user32" (ByVal hWnd As Long, _
        ByVal lpText As Long, ByVal lpCaption As Long, ByVal msgType As VbMsgBoxStyle) As VbMsgBoxResult


Public Function MessageBox(ByVal hWnd As Long, ByVal lpText As String, _
       ByVal lpCaption As String, ByVal mbStyle As VbMsgBoxStyle) As VbMsgBoxResult
  #If ANSISupport Then          ' allow both variants, if ANSI should be supported
    If isUnicode Then
      MessageBox = MessageBoxW(hWnd, StrPtr(lpText), StrPtr(lpCaption), mbStyle)
    Else
      MessageBox = MessageBoxA(hWnd, lpText, lpCaption, mbStyle)
    End If
  #Else                         ' fast: only UNICODE version
    MessageBox = MessageBoxW(hWnd, StrPtr(lpText), StrPtr(lpCaption), mbStyle)
  #End If
End Function

ralf schlegel
im Dezember 2012