![]() |
AW: Unicode und WideChar API-Funktionen
Zitat:
Delphi-Quellcode:
bzw.
{$Mode DelphiUnicode}
Delphi-Quellcode:
macht String zu UnicodeString, und (P)Char zu (P)WideChar. An den Imports der API-Funktionen ändert sich nichts, d.h. der Alias ExpandEnvironmentStrings verweist weiterhin auf ExpandEnvironmentStringsA statt ExpandEnvironmentStringsW.
{$ModeSwitch UnicodeStrings}
Analog gilt das auch für die Klassen und Funktionen der Free Pascal RTL, wie man auch im von dir verlinkten Teil lesen kann. TIniFile und TFileStream kommen nach dem Umschalten nicht automatisch mit Unicode-Dateinamen bzw. -inhalten klar. Naja, vielleicht kommen sie schon damit klar (diese Frage ist ja weiterhin ungeklärt), aber es gibt beim Kompilieren Warnungen. Um die loszuwerden, muss man sich jeden einzelnen Aufruf anschauen und ändern, also eine andere Funktion rufen (z.B. UnicodeFormat statt Format), Casten oder Konvertierungsfunktion rufen. Das bedeutet, es kann eben nicht alles so bleiben. Zitat:
Delphi-Quellcode:
?
{$ModeSwitch UnicodeStrings}
Grüße Dalai |
AW: Unicode und WideChar API-Funktionen
Ich habe mal für Dich im Lazarus Forum nachgefragt und die Antwort ist traurig, es geht schlichtweg nicht per switches oder conditionals.
Die einzige Möglichkeit ist es in der "Windows.pp" unit das hier einzufügen (was allerdings gegen die FPC/Lazarus Programmierung Arbeit, also ohne Gewähr!) Patch:
Delphi-Quellcode:
getestet mit Lazarus 2.3.0 (rev 3bdbedd91b) FPC 3.2.2 x86_64-win64-win32/win64
{
This file is part of the Free Pascal run time library. This unit contains the record definition for the Win64 API Copyright (c) 1999-2006 by Florian KLaempfl, member of the Free Pascal development team. See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} unit windows; {$PACKSET 1} {$ifndef NO_SMART_LINK} {$smartlink on} {$endif} { stuff like array of const is used } {$mode objfpc} {$modeswitch ADVANCEDRECORDS} {$modeswitch class} {$inline on} {$calling stdcall} {$define FPC_OS_UNICODE} // <<<--- füge das ein {$ifdef FPC_OS_UNICODE} {$define UNICODE} {$endif} |
AW: Unicode und WideChar API-Funktionen
Die bräuchten ja doch nur für ihren Code (INC's) die passenden Unicode-Alternativen, welche über diesen Schalter umgeschaltet werden. :stupid:
|
AW: Unicode und WideChar API-Funktionen
Mir wurde soeben eine bessere Variante gezeigt ohne das die RTL "angegriffen" wird und ich hoffe die ist okay für Deine Zwecke @Dalai
Delphi-Quellcode:
unit Unit1;
// basis settings um es unicode fähig zu machen {$mode objfpc} {$modeswitch unicodestrings} interface uses Windows , // ganz regulär integrieren Classes , SysUtils , Forms , Controls , Graphics , Dialogs; // unicode hack teil 1/2 {$define read_interface} {$undef read_implementation} {$i C:\FreePascal\fpcsrc\rtl\win\wininc\unidef.inc} type { TForm1 } TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private public end; var Form1: TForm1; implementation // unicode hack teil 2/2 {$undef read_interface} {$define read_implementation} {$i C:\FreePascal\fpcsrc\rtl\win\wininc\unidef.inc} {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); var lpApplicationName: PChar; // (PWideChar/LPCWSTR) lpBinaryType: LPDWORD; begin GetBinaryType(lpApplicationName, lpBinaryType); // zeigt nun auf function GetBinaryType(lpApplicationName:LPCWSTR; lpBinaryType:LPDWORD):WINBOOL; external 'kernel32' name 'GetBinaryTypeW'; end; end. |
AW: Unicode und WideChar API-Funktionen
Delphi 2009 hat angerufen und will seine Unicodeumstellung zurück :lol:
|
AW: Unicode und WideChar API-Funktionen
Zitat:
Zitat:
Zitat:
Dennoch vielen vielen Dank für deinen Einsatz! :-D Bin mal gespannt, wie lange es noch dauert, bis die Umstellung der Free Pascal RTL auf Unicode abgeschlossen ist ... Vielleicht vor dem Ende dieses Jahrzehnts? ;) Mittlerweile hab ich die Units eines meiner Projekte geändert auf UnicodeString und WideChar. Zum Testen genügt mir das. Mal sehen, ob ich die Entwicklung mit Free Pascal/Lazarus weiter verfolge. Grüße Dalai |
AW: Unicode und WideChar API-Funktionen
Lang lang ist's her.
als ich damals rein sah, gab es in RTL/VCL, bzw. den Quellen des FPC und des Lazarus einen Mischmasch aus ANSI und UTF8, mit einem Hauch von Unicode. Die RTL kann man zu großen Teilen mit UTF-8 benutzen, also TStringList usw. (so lange intern keine krittischen APIs benutzt werden), aber mindestens für die Schnittstelle vom/zum Windows (Win32-API), also auch die VCL, braucht es aber eben ANSI oder Unicode, da nicht alles UTF-8 versteht. Den INI-Inhalt gibt es offiziell (Microsoft) nur als ANSI oder Unicode (UTF-16 und früher UCS-2), aber so lange man die INI (Inhalt) nur selber benutzt ... UTF-8 ist ja auch eine Art von ANSI. Nur der Dateiname für die INI/StringList muß eben ANSI oder Unicode sein. (UTF-8 will die ANSI-API nicht verstehen, denn die erwartet dort CP_ACP oder notfalls auch CP_OEM) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz