[FIX] ADO レコードセットを ByRef で渡すとエラー情報がリセットされる

この記事は、以前は次の ID で公開されていました: JP264701
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
ByRef のメソッド パラメータを使用して ADO レコードセットをアウトプロセス COM オブジェクトに渡したとき、アウトプロセス COM オブジェクトがエラーを生成しても、そのエラー情報がクライアントに正しく報告されない場合があります。
原因
ByRef のメソッド パラメータによってアウトプロセスに ADO レコードセットがマーシャリングされると、ADO に実装されたカスタム マーシャリング コードがクライアント側とサーバー側の両方でアクティブ化されます。このコードは、COM オブジェクトから生成された未処理の OLE エラー オブジェクトをリセットしてしまいます。
回避策
回避策の 1 つとして、ADO レコードセットを渡すときには ByVal のパラメータを使い、戻り値を利用して ADO レコードセットを返すという方法が利用できます。
状況

Windows 2000

この問題を解決するためのモジュールは、Windows 2000 日本語版 Service Pack 2 以降に含まれております。
Windows 2000 日本語版の最新 Service Pack については、以下 Web サイトから入手できます。
詳細
COM メソッド パラメータのうち、COM オブジェクトのタイプ ライブラリに [in, out] パラメータとして定義されているものは ByRef パラメータになります。Microsoft Visual Basic (VB) で COM オブジェクトを作成し、いくつかのメソッド パラメータに ByRef キーワードを追加すると、COM オブジェクトのタイプ ライブラリで [in, out] ディレクティブが使用され、そのメソッドは、オブジェクト変数を受け取って呼び出し側に返すことができるようセットアップされます。

この問題は、次の条件に該当する場合に再現することが確認されています。
  1. Visual Basic または Visual C++ の COM EXE において、ByRef [in, out] を使用して ADO レコードセットを受け取り、メソッド呼び出しの中でエラーを生成した場合。
  2. MTS または COM+ でホストされる COM DLL を Visual Basic や Visual C++ で作成し、ByRef [in, out] を使用して ADO レコードセットを受け取り、メソッド呼び出しの中でエラーを生成した場合。
このような状況では、COM コンポーネントから生成された実際のエラーがクライアントに通知されるのではなく、"'~' メソッドは失敗しました : '~' オブジェクト" というエラーが報告されます。

クライアントと COM サーバーが別々のコンピュータ上に存在する場合 (たとえば、DCOM を利用して リモート COM サーバーに接続する場合)、問題を解決するためには、この修正プログラムをクライアントおよびサーバーの両方のコンピュータに適用する必要があります。
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 264701 (最終更新日 2001-04-28) をもとに作成したものです。

プロパティ

文書番号:264701 - 最終更新日: 02/23/2014 22:14:19 - リビジョン: 2.0

  • Microsoft Data Access Components 2.5
  • kbnosurvey kbarchive kbbug kbfix kbqfe kbgrpdsmdac kbado kbhotfixserver KB264701
フィードバック