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.