次の方法で共有


例外によってエラーを示す

従来の C プログラマの場合、エラーは通常、戻り値またはエラー コードを返す特別な [out] パラメーターを使用して返されます。 これにより、インターフェイスは次のように実装されます。

long sample(...)
{
    ...
    p = new Cbar(...);
    if (p == NULL)
    {
        // cleanup
        ...
        return ERROR_OUTOFMEMORY;
    }
}

この方法の問題は、RPC の戻り値が単に長整数であるという点です。 エラーとして特別な意味はありません (error_status_t にはサーバー側に特別なセマンティクスがないことに注意してください)。これは重要な影響を及ぼします。

最初に、RPC は操作が失敗したことを警告しません。すべての [in,out] 引数と [out] 引数のマーシャリングを解除しようとします。 コンテキスト ハンドルのエラー セマンティクスも異なります。 クライアントに返されるパケットは基本的に成功パケットであり、エラー コードはパケットの深部に埋め込まれます。 これは、RPC が拡張エラー情報を使用しないため、多くの場合、クライアント ソフトウェアは呼び出しが失敗した場所を識別できないことを意味します。

(C++ ではなく) 構造化例外処理 (SEH) 例外をスローして RPC サーバー ルーチンのエラーを示す方がはるかに優れたアプローチです。 SEH 例外がスローされると、制御は RPC ランタイムに直接送信されます。 適切にクリーンアップできないルーチンの深部でエラーが発生する場合があり、呼び出し元にエラーを示す必要があります。 ルーチンは呼び出し元にエラーを返す必要があり、呼び出し元にエラーを返すことができます。 ただし、スタック上の最後のサーバー ルーチンは、エラーが発生したことを RPC に示すために RPC に戻る前に例外をスローする必要があります。

例外処理の