2009年に、さまざまなポイントでワイドストリングを使用したいくつかのアプリケーションを再コンパイルすると、奇妙な動作が発生します。
Delphi 2009アプリでは、WidestringはStringと同じですか?
2009年に、さまざまなポイントでワイドストリングを使用したいくつかのアプリケーションを再コンパイルすると、奇妙な動作が発生します。
Delphi 2009アプリでは、WidestringはStringと同じですか?
いいえ、それらは同一ではありません。
WideString
BSTR
ActiveX/COMタイプの単なるラッパーです。ActiveX/COMで文字列を操作するときに必要です。
String
Delphi 2009以降では、のエイリアスでUnicodeString
あり、Unicode文字を保持できますがBSTR
、と同じではありませんWideString
。WideString
COMメモリマネージャによって割り当てられ、参照カウントされません。 UnicodeString
はRTLメモリマネージャによって割り当てられ、そのまま参照カウントされAnsiString
ます。
(Unicode)String
可能な限り使用WideString
し、COM相互運用、またはWideString
Unicodeサポートに使用するレガシーライブラリの処理にのみ使用する必要があります。
答えはここにあるようです:
Delphi 2009での最も劇的な変更は、「文字列」型がAnsiStringではなくUnicodeStringのエイリアスになったことです。
注意すべきもう 1 つの重要な点は、パフォーマンスの違いです。
Marco Cantu のホワイト ペーパー (moodforaday の回答で参照) では、次のように述べています。
「WideString は (今も) 参照カウントされておらず、パフォーマンスと柔軟性の点で非常に貧弱です (たとえば、ネイティブの FastMM4 ではなく Windows グローバル メモリ アロケータを使用しています)。」
私が見たほとんどすべての Delphi 2009 のアップグレード ガイドでは、すべての WideString を String に変換することを推奨しています。
Delphi 2009 での文字列(つまり UnicodeString)の仕組みを概説している Marco Cantu によるこの論文を参照してください。
「ホワイト ペーパー: Delphi と Unicode」
http://dn.codegear.com/article/38980
基本的にはロディが言ったことですが、詳しく説明するには 27 ページかかります。