Wie vielleicht von vielen bereits bemerkt, sind die meisten Userlibaries zur
Zeit nicht kompatible mit Unicode Anwendungen. Dies liegt daran, das die
Libraries als ASCII-compiliert werden. Wenn diese Libraries nun zu eine
Unicode Executable gelinkt werden, verstehen die Libraries nur noch
Bahnhof.
Echte Kompatiblität ist zur Zeit nicht möglich, aber die Möglichkeit, das
diese Libraries auch dann funktionieren, wenn sie zu einer
Unicode-Executable gelinkt wurden, besteht.
Hierzu sind 3 Maßnahmen erforderlich.
1.Stringparameter
Beispiel: (TailBite-Source)
Code: Alles auswählen
ProcedureDLL Foo(MyString.s)
; bla
ProcedureReturn bla
EndProcedure
Funktion MyString als Unicode und versteht es nicht.
Abhilfe:
Wir erstellen eine weiter Procedure, mit dem anhängsel _UNICODE, diese
wird laut SDK-Doku, im Falle einer Unicode-Anwendung aufgerufen. Hier
wird der Unicode-String nach ASCII gewandelt!
Beispiel:
Code: Alles auswählen
ProcedureDLL Foo_UNICODE(MyString.s)
; MyString per PeekS auslesen und einer temporären ACII Variablen zuordnen
Protected MyString_Ansi.s = PeekS(@MyString, #PB_Any, #PB_Unicode)
; wieder der Originalvariablen zuordnen (nicht unbedingt erforderlich)
MyString = MyString_Ansi
; Original Procedure mit ASCII-String aufrufen
ProcedureReturn Foo(MyString)
EndProcedure
Beispiel:
Code: Alles auswählen
ProcedureDLL.s Foo()
; bla
ProcedureReturn "Bla"
EndProcedure
Auch hier nutzen wir obiges Feature mit _UNICODE
Beispiel:
Code: Alles auswählen
ProcedureDLL.s Foo_UNICODE()
Protected Result.s = Foo(); Ascii ergebnis von Original Funktion holen
Protected Result_Uni.s = Space(Len(Result) * 2); Speicher für UnicodeString
PokeS(@Result_Uni, Result, #PB_Any, #PB_Unicode) ; Ergebnis von Foo() als Unicode in Buffer poken
ProcedureReturn Result_Uni ; Unicode String zurückgeben
EndProcedure
Alle API-Aufrufe in unser UserLib erfordern die ASCII Version,
UNICODE-Anwendungen nutzen jedoch autom. die UNICODE-Pedants.
Abhilfe:
Wir importieren alle API-Funktionen in unserem Librariesource, als
ASCII-Variante
Code: Alles auswählen
Import "user32.lib"
MessageBoxA(Window.l, Body.s, Title.s, Flags.l)
EndImport
verwenden!
Ich hoffe mal, diese Infos sind für den einen oder anderen Hilfreich beim
erstellen von UserLibs
Für eine Übersetzung, die im engl. Forum gepostet werden kann, wäre ich
dankbar.
Gruß
Thomas, der hoffentlich nicht zuviele Fehler eingebaut hat