メイソンとジェローンの両方が私に促したのを見て、ここに行きます:(ジェローン、あなたのものを落とさないでください、あなたにも有効なポイントがあります).
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 ドキュメントを確認してください。
リンク: