Aktuelle Zeit: 22.10.2019 03:05

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Erstellen von Unicode kompatiblen Userlibaries mit TailBite
BeitragVerfasst: 13.09.2006 06:05 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Erstellen von Unicode kompatiblen Userlibaries mit TailBite (1.3 PR8)

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:
ProcedureDLL Foo(MyString.s)
   ; bla
   ProcedureReturn bla
EndProcedure


Wenn wir diese Librarie in einer Unicode Anwendung aufrufen, erhält die
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:
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


2.Stringrückgaben
Beispiel:
Code:
ProcedureDLL.s Foo()
 ; bla
   ProcedureReturn "Bla"
EndProcedure


Abhilfe:
Auch hier nutzen wir obiges Feature mit _UNICODE
Beispiel:
Code:
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


3. API-Aufrufe
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:
Import "user32.lib"
  MessageBoxA(Window.l, Body.s, Title.s, Flags.l)
EndImport


Jetzt dürfen wir im Librarie-Source aber nur noch MessageBoxA
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

_________________
PureBasic 5.71 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.09.2006 15:25 
Offline
Benutzeravatar

Registriert: 29.08.2004 20:11
Wohnort: Schweiz
Habs jetzt nicht getestet, aber ich denke, das du das schon gemacht hast :D
Also wenn die PB-internen Dinge so stimmen, kann man das wohl als
Übergangslösung verwenden. Trotzdem, wie du sicher selber weisst, ist
der Aufwand zu gross, und da dieser 'Hack' sowieso meist sein Ziel ver-
fehlt, würde ich mir die Mühe sparen. Gerade die Unterstützung von
anderen Sprachen ist so natürlich nicht möglich, was ja Sinn und Zweck
von Unicode ist...
Kurzes Beispiel:
Code:
; Als Unicode kompilieren.
ProcedureDLL.l NPeekS(*mem.CHARACTER, lLength.l = -1, lFlag.l = 0)
  Protected s.s, *t, lMemLen.l
 
  If lFlag
    Select lFlag
      Case #PB_Unicode
          lMemLen = WideCharToMultiByte_(#CP_ACP, 0, *mem, lLength, *s, 0, 0, 0)
          *s = AllocateMemory(lMemLen)
          WideCharToMultiByte_(#CP_ACP, 0, *mem, lLength, *s, lMemLen, 0, 0)
         
          ProcedureReturn *s
    EndSelect
   
  EndIf
EndProcedure


s.s = "日本語"

Debug s

Debug PeekS(NPeekS(@s, -1, #PB_Unicode), -1, #PB_Ascii)


Aber immerhin: Kompilieren lassen sich die Libs dann anscheinend und
für Programme, die nur Libs benutzen zur Ausgabe von englischen Texten,
kann man diesen Tipp sicher anwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.09.2006 15:33 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Ist auch nur dafür gedacht :wink:
Das dadurch keine Unicode-Unterstützung zustande kommt, ist mir klar, aber
die Libs funktionieren wenigstens, insofern sie keine Zeichen aus dem
erweiterten Zeichensatz benötigen.

_________________
PureBasic 5.71 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye