Die Frage ist also, ob String-Literale (oder const-Strings) in Delphi 2009/2010 direkt als PAnsiChar gecastet werden können oder ob sie zuerst in AnsiString gecastet werden müssen, damit dies funktioniert?
Der Hintergrund ist, dass ich Funktionen in einer Legacy-DLL mit einer C-Schnittstelle aufrufe, die einige Funktionen hat, die Char-Zeiger im C-Stil erfordern. In der Vergangenheit (vor Delphi 2009) Code wie der folgende funktionierte wie ein Charme (wo die param an die C-DLL-Funktion ist ein LPCSTR):
entweder:
LegacyFunction(PChar('Fred'));
または
const
FRED = 'Fred';
...
LegacyFunction(PChar(FRED));
Daher habe ich beim Wechsel zu Delphi 2009 (und jetzt 2010) den Aufruf in diesen geändert:
LegacyFunction(PAnsiChar('Fred'));
または
const
FRED = 'Fred';
...
LegacyFunction(PAnsiChar(FRED));
Dies scheint zu funktionieren, und ich erhalte die richtigen Ergebnisse aus dem Funktionsaufruf. Es gibt jedoch eine deutliche Instabilität in der Anwendung, die vor allem beim zweiten oder dritten Mal durch den Code auftritt, der die Legacy-Funktionen aufruft (was vor dem Wechsel zur Version 2009 der IDE nicht der Fall war). Bei der Untersuchung des Problems habe ich festgestellt, dass das native String-Literal (und const-String) in Delphi 2009/2010 ein Unicode-String ist, so dass mein Cast möglicherweise fehlerhaft war. Beispiele hier und anderswo scheinen darauf hinzuweisen, dass dieser Aufruf eher wie folgt aussehen sollte:
LegacyFunction(PAnsiChar(AnsiString('Fred')))
Was mich verwirrt ist, dass mit dem Code oben in den zweiten Beispielen, Casting der String-Literal direkt zu einem PAnsiChar keine Compiler-Warnungen erzeugt. Würde ich statt eines String-Literal eine String-Var casten, würde ich eine verdächtige Cast-Warnung erhalten (und der String würde verstümmelt werden). Dies (und die Tatsache, dass die Zeichenfolge in der DLL verwendbar ist) führt mich zu glauben, der Compiler tut einige Magie, um die Zeichenfolge-Literal als den beabsichtigten String-Typ korrekt zu interpretieren. Ist es das, was passiert, oder ist die doppelte Umwandlung (zuerst in AnsiString, dann in PAnsiChar) wirklich notwendig und das Fehlen dieser Umwandlung in meinem Code der Grund für die schwer aufzuspürende Instabilität? Und gilt die gleiche Antwort auch für const-Strings?