2

Delphi 2010 で dll を作成しましたが、それは Delphi 7 アプリケーションで使用されています。

私はUnicode AnsiString / stringの問題を認識しており、私のテストによると、私のdelphi 2010 dllによって例外が発生しないまではすべて正常に動作しています。

実際、Unicode/AnsiString の世界と互換性のある特別な/処理された例外はありますか? つまり、私の Delphi 2010 は、私の Delphi 7 アプリで適切に処理できる例外を発生させることができますか?

助けてくれてありがとう。

ダニーロ。

4

3 に答える 3

4

メイソンとジェローンの両方が私に促したのを見て、ここに行きます:(ジェローン、あなたのものを落とさないでください、あなたにも有効なポイントがあります).

Jeroen は、特定の言語は dll の境界を越えてはならないと述べています。ある点までは同意します。特に文字列などの言語固有の機能に関しては、dll の使用目的によって異なります。Delphi プロジェクトでのみ使用される dll を開発する場合、特にそれが独自の Delphi プロジェクトでのみ使用される場合、文字列が境界を越えるのを避けるためだけに PChar などをいじる理由はありません。

したがって、例外は言語固有のものですが、私にとっては、例外が dll をエスケープできない主な理由ではありません。また、言語の特異性のために、dll の外部でそれらを処理することが不可能であるという事実もありません。

例外が dll をエスケープできないようにする基本的な理由は、例外がスレッドをエスケープできないようにするのと同じです。さらに、スレッドをエスケープする例外により、アプリがクラッシュします。これは、dll をエスケープする例外の場合には当てはまらない可能性がありますが、dll では、スレッドが自己完結型のエンティティである必要があるだけでなく、誰がそれを呼び出しているかに関係なく、予期しない状況を処理する際に呼び出し元から独立していることも含まれます。つまり、例外。

では、dll が発信者全体を踏みにじらないようにするにはどうすればよいでしょうか。ローマに通じる道はたくさんあると思いますが、私の頭に浮かぶ最も単純な道は、OLE の機能です。

  • エクスポートされたすべてのメソッドは、呼び出し元にすべてがうまくいったかどうか、または何か問題が発生したかどうかを伝えるコードを返す必要があります。

  • 戻りコードは具体的にしてください。何かがうまくいかなかったことを報告するだけでなく、メソッドが呼び出されたことを実行するのを止めるすべてのコードを用意してください。そのため、DLL_OK、DLL_OUT_OF_MEMORY、DLL_FILE_NOT_FOUND、DLL_INVALID_XXX (無効な入力パラメーターを報告するため) などのコードがあります。

  • dll を呼び出すアプリで、一般的な DLL_Check 関数をコーディングして、リターン コードをチェックし、コードの残りの部分が適切と思われる場合に処理できる適切な例外を発生させます。

  • これを行うには、特定の例外クラスを使用します。つまり、一般的な EDllError 例外クラスと、処理が必要な特定の状況に対応するさまざまな派生クラスです。これは、E... do コーディングの例外に大いに役立ちます。

  • メソッドの戻り値は ok/error レポートに使用されるため、意味のある値を返す必要があるメソッドでは out または var パラメータを使用します。

  • 特定のリターン コードの例と、var および out パラメータを使用して呼び出し元と情報を交換する方法については、OLE ドラッグ ドロップに関する msdn ドキュメントを確認してください。

リンク:

于 2010-06-26T08:10:04.230 に答える
3

私は答えを蹴ります。Marjan が投稿した場合、私は私の投稿を削除します。
編集: Marjan から、回答を保持するように求められました。あなたが私のものを好きなら、彼女の答えにいくつかの賛成票を投じてください(私の答えは彼女の最初のコメントに大いに触発されたので).

DLL に関する全体的な考え方は、DLL が言語に依存しないということです。
例外は、言語に大きく依存する機能です(多くの言語には例外がありますが、実装方法はそれぞれ異なります。この場合は Delphi です。同じ言語のバージョンが異なれば、異なる方法が使用されることもあります)。

したがって、DLL は、言語に依存しない機能のみが DLL の境界を越えるようにする必要があります。
言語に依存する機能は、DLL の境界を越えてはなりません。
これには例外が含まれます。

つまり、代替手段を探す必要があります。
Windows API は、エラー コード、GetLastErrorおよびFormatMessageを使用してこれを行います。
DLL で同様のものを考案できます。
ただし、Delphi 文字列も言語に依存することに注意してください。そのため、文字配列(または文字配列へのポインタ)に基づいて FormatMessage などを実装する必要があります。

--jeroen

于 2010-06-25T22:05:55.223 に答える
3

Delphi は、呼び出し元と呼び出し先の間で通常の DLL 境界を越えて伝播する例外を常に「許容」してきました。ただし、その「許容範囲」は、呼び出し元と呼び出し先の両方が同じ Delphi バージョンである場合にのみ適用されます。バージョン間で機能したのは、いくつかのリリースで Exception クラスのレイアウトと宣言が変更されていないためです。Delphi 2009 が導入されたとき、多くの低レベルの実装の詳細が変更されました(最も顕著なのは、文字列の内部実装です)。これが明らかな「失敗」の原因です。例外が dll を決してエスケープしてはならないという 1 つのコメントは、非常に適切です。

于 2010-06-25T22:09:38.573 に答える