Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Unicode und WideChar API-Funktionen

  Alt 4. Apr 2023, 21:34
Also, wenn man mit Pointer rumpfuscht, anstatt PWideChar zu benutzen ... wenn irgendwann der Typ nicht mehr stimmt, dann beschwere dich bitte nicht, wenn der Compiler dir nichts sagen wird.

Warum wird hier ein UnicodeString an einen String (laut Hint in der Lazarus IDE ist String = AnsiString) zugewiesen?
Jemand hat vergessen zu sagen in welcher Zeile.
Ich rate mal.
Die Letzte? (mit dem Result:=)
Und nun überleg mal was du dort machst.

Delphi-Quellcode:
SetLength(Buffer, GetModuleFileNameW(Module, nil, 0));
GetModuleFileNameW(Module, PWideChar(Buffer), Length(Buffer)+1);
Aber wenn du sowie so kein Unicode haben willst, dann

Delphi-Quellcode:
function GetModuleName(Module: HMODULE): string; // oder eben UnicodeString und nachfolgend PWideChar
begin
  SetLength(Result, GetModuleFileName(Module, nil, 0));
  GetModuleFileName(Module, PChar(Result), Length(Result)+1);
end;
Im Delphi war String früher AnsiString und GetModuleFileName ein Alias für GetModuleFileNameA, bzw. PChar ein PAnsiChar,
und nun ist String ein UnicodeString und GetModuleFileName ein Alias für GetModuleFileNameW mit PWideChar.
Eventuell gibt es sowas mit dem genannten {$ModeSwitch UnicodeStrings} auch für Lazarus?



Delphi-Quellcode:
Result := Buffer;
Result := String(Buffer);
Mit Cast oder implitzt kommt erstmal das Gleiche bei raus, also vom Inhalt ... nur das Letzteres eben keine Cast-Warnung wirft.

Ich weiß nicht wie Lazarus/FPC das macht.
Vermutlich wie Delphi früher. Da wurde die Codepage des Types verwendet, also von der Variable.
Delphi seit 2009, hat die Codepage zusätzlich im String gespeichert und Verwendet vorzugsweise Dieses. (auch wenn man mal z.B. UTF-8 in einem "AnsiString" drin hat und nicht den UTF8String benutzte)



Zitat:
Currently the {$ModeSwitch UnicodeStrings} can be tested by defining "UseUTF16".
Vielleicht meinen die es andersrum?

vorher irgendwo {$ModeSwitch UnicodeStrings}
und später dann mit {$IFDEF UseUTF16} testen.
$2B or not $2B

Geändert von himitsu ( 5. Apr 2023 um 03:25 Uhr)
  Mit Zitat antworten Zitat