Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#1

Unicode und WideChar API-Funktionen

  Alt 27. Mär 2023, 15:37
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
  Mit Zitat antworten Zitat