У меня странное поведение при перекомпиляции некоторых приложений в 2009 году, которые использовали широкие строки в разных точках.
В приложении Delphi 2009 Widestring идентичен String?
У меня странное поведение при перекомпиляции некоторых приложений в 2009 году, которые использовали широкие строки в разных точках.
В приложении Delphi 2009 Widestring идентичен String?
Нет, они не идентичны.
WideString
- это просто оболочка для типа ActiveX / COM BSTR
. Он понадобится вам при работе со строками в ActiveX / COM.
String
в Delphi 2009 и более поздних версиях является псевдонимом для UnicodeString
, который может содержать символы Unicode, как и BSTR
, но НЕ то же самое, что WideString
. WideString
выделяется диспетчером памяти COM и не учитывается. UnicodeString
выделяется диспетчером памяти RTL и подсчитывается по ссылкам, как и AnsiString
.
Вы должны использовать (Unicode)String
везде, где это возможно, и использовать WideString
только для COM-взаимодействия или работы с устаревшими библиотеками, которые используют WideString
для поддержки Unicode.
Кажется, ответ находится здесь а>:
Наиболее драматическим изменением в Delphi 2009 является то, что тип «строка» теперь является псевдонимом UnicodeString вместо AnsiString.
Еще одна важная вещь, на которую следует обратить внимание, - это разница в производительности.
В Белой книге Марко Канту (упомянутой в ответе moodforaday) говорится:
«WideString не учитывалась (и до сих пор не учитывается) и имеет крайне низкую производительность и гибкость (например, она использует глобальный распределитель памяти Windows, а не собственный FastMM4)».
Почти в каждом руководстве по обновлению Delphi 2009, которое я видел, рекомендуется преобразовать все WideStrings в Strings.
См. Этот документ Марко Канту, в котором описывается работа строки (например, UnicodeString) в Delphi 2009:
«Белая книга: Delphi и Unicode»
http://dn.codegear.com/article/38980
По сути, это то, что сказал Родди, но для подробностей требуется 27 страниц.