Hallo ihr
.
Aus bestimmten Gründen versuche ich mich derzeit an Free Pascal. Leider blieb ich sehr schnell an der Thematik
Unicode und WideChar
API-Funktionen hängen, und auch die vielfältigen Angaben im Internet helfen mir nicht dabei, die Sache für mich zufriedenstellend - mit möglichst wenigen Änderungen am Code - zu lösen.
Gegeben sei folgender, auf das Wesentliche reduzierte Beispiel-Code:
Delphi-Quellcode:
program project1;
{$MODE DELPHI}
uses Classes, SysUtils, CustApp, Windows;
type
TMyApplication = class(TCustomApplication)
private
FStr: string;
[...]
end;
procedure TMyApplication.DoRun;
begin
[...]
SetLength(FStr, 32768);
SetLength(FStr, ExpandEnvironmentStrings(PChar('%SystemRoot%\System32'), @FStr[1], Length(FStr))-1);
WriteLn(FStr);
ReadLn;
end;
Funktioniert einwandfrei. Aber es wird die
ANSI-Variante der
API-Funktion (ExpandEnvironmentStringsA) importiert. Nun wollte ich die Sache unicodefähig machen, also dachte ich mir, setze ich
{$MODE DELPHIUNICODE}
. Leider Fehlanzeige:
Code:
Compile Project, Mode: Debug, Target: project1.exe: Exit code 1, Errors: 1, Warnings: 2
project1.lpr(36,14) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString"
project1.lpr(38,44) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
project1.lpr(52,50) Error: Incompatible type for arg no. 1: Got "PWideChar", expected "PChar"
(Der Error wird an der Stelle des Calls der
API-Funktion gemeldet.) Soweit ich das bisher verstandenn habe, liegt das daran, dass nur die eigene
Unit in Bezug auf Strings und PChars umdefiniert wird, die von FPC mitgebrachten Units aber nicht. Es wird also weiterhin ExpandEnvironmentStringsA benutzt.
Wie kann man das lösen bzw. was ist der empfohlene Weg, dass der Code sowohl in Delphi als auch FPC verwendbar ist? Es kann ja nicht Sinn der Sache sein, den Code mit expliziten Aufrufen der Wide-Funktionen und - bei umfangreicherem Code - zahllosen IFDEFs zuzupflastern...
Grüße
Dalai