2011-12-06 10 views
1

私のアプリケーションはDelphi 2010でコンパイルされています。そのアプリケーションは、Delphi 2010コンパイル済みDLLをロードするDelphi 7コンパイル済みDLLをロードします。Delphi 2010アプリケーションDelphi 7 DLLをロード

D2010 app LOADS D7 DLL LOADS D2010 DLL 

D7 DLLのエクスポートされた関数は、Widestrings使用とDelphi 2010 DLL使用stringsのエクスポート機能。

Delphi 2010のstringsはUnicode(2バイト)で、Delphi 7ではAnsi(1バイト)です。

私のすべてのテストでは、そうしてはいけないという事実にもかかわらず、それが働いていることがわかりました。私は不思議に思っています:

どうしてですか?

何が問題になりますか?

どのメモリマネージャ、私が使用する必要があります(デルファイ2010またはDelphi 7のメモリマネージャDLL)

+0

これは問題ですか? ;-) – Pol

+0

@Pol no、それはありません。私はそれがなぜ機能するのか理解しようとしています。 –

+0

質問にはお答えできませんが、両方でWideStringを使用することができます。徹底的な答えのために+1 – Pol

答えて

7

D2009とD2010では、RTLはAnsiStringがUnicodeペイロードを受信することができます代わりにロジック(コンパイラの{$STRINGCHECKS ON}ディレクティブを)持っています、およびUnicodeStringは、モジュールの境界を越えてAnsiペイロードを受信し、次にAnsiString/UnicodeStringのデータにアクセスすると、正しい文字列型にサイレントインラインデータ変換を実行します。これは主に、C++側のAnsiStringパラメータとDelphi側のUnicodeString変数を持つイベントハンドラを使用するレガシーC++プロジェクトをサポートするためです。この場合、D7 DLLがAnsiデータをD2010 DLLに渡すこともできます(ただし、STRINGCHECKSディレクティブはXEでは削除されています)。

StrRecレコード(メモリ内の文字データの前にある)のメモリレイアウトがコードページのサポートを追加するためにD2009で変更されたため、D710 DLLが失敗すると思いますD2010互換StrRecAnsiStringの値をD2010 DLLのUnicodeStringパラメータに渡すと、存在しないメモリにアクセスしようとすると、D2010 DLLがクラッシュすることが予想されます。

これは、String型をDLLの境界に渡って渡すことに対する、もう一つの議論です。ただそれをやってはいけません。代わりにWideStringまたはPAnsiChar/PWideCharを使用してください。

+0

+1。 – Pateman

+0

+1は素晴らしい答えです。 –

+0

+1すばらしい答え。 STRINGCHECKSの詳細http://www.micro-isv.asia/2010/09/stringchecks-gone-in-delphi-xe/ – Pol

関連する問題