Таким образом, вопрос заключается в том, могут ли строковые литералы (или константные строки) в Delphi 2009/2010 напрямую передаваться как PAnsiChar, или им сначала нужно дополнительное приведение к AnsiString, чтобы это работало?
Исходным фоном является то, что я вызываю функции в устаревшей DLL с интерфейсом C, который имеет некоторые функции, для которых требуются указатели символов в стиле C. В прошлом (до Delphi 2009) код, подобный следующему, работал как шарм (где параметром функции C DLL является LPCSTR):
либо:
LegacyFunction(PChar('Fred'));
или
const
FRED = 'Fred';
...
LegacyFunction(PChar(FRED));
Итак, при переходе на Delphi 2009 (а теперь и в 2010 году) я изменил вызов так:
LegacyFunction(PAnsiChar('Fred'));
или
const
FRED = 'Fred';
...
LegacyFunction(PAnsiChar(FRED));
Кажется, это работает, и я получаю правильные результаты от вызова функции. Однако в приложении существует определенная нестабильность, которая, по-видимому, возникает в основном во второй или третий раз в коде, который вызывает унаследованные функции (которого не было до перехода на версию IDE 2009 года). Исследуя это, я понял, что нативный строковый литерал (и константная строка) в Delphi 2009/2010 - это строка в Юникоде, поэтому мое приведение могло быть ошибочным. Примеры здесь и в других местах указывают на то, что этот вызов должен выглядеть примерно так:
LegacyFunction(PAnsiChar(AnsiString('Fred')))
Что меня смущает, так это то, что при приведенном выше коде во втором примере приведение строкового литерала непосредственно к PAnsiChar не генерирует никаких предупреждений компилятора. Если бы вместо строкового литерала я приводил строковую переменную, я получал бы подозрительное предупреждение о приведении (и строка была бы искажена). Это (и тот факт, что строку можно использовать в DLL) заставляет меня поверить, что компилятор делает некоторую магию, чтобы правильно интерпретировать строковый литерал как предполагаемый тип строки. Это то, что происходит, или двойное приведение (сначала к AnsiString, затем к PAnsiChar) действительно необходимо, и отсутствие этого в моем коде является причиной трудной для отслеживания нестабильности? И остается ли такой же ответ верным и для константных строк?