- PR -

C#で作成したCOMのエラー情報を C++のプログラムから取得したい

1
投稿者投稿内容
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2004-12-06 19:19
現在、以下の構成でプログラムを作成しています。

COMサーバ : VC#.NET
COMクライアント : VC++6.0

呼び出しなどは正常にできているのですが、COMサーバで例外を返し、それをクライアント側
で catch すると、「Unknown Error」としか取得できずに困っています。
コード:
VC#.NET

  throw new Exception("エラー情報") ;

VC++6.0

  catch ( _com_error &error )
  {
      char errgmsg[1024] ;
      strcpy( errmsg, error.ErrorMessage() ) ;
                  :      
  }


としていますが、catch はできるものの、エラーメッセージが取得できません。
VC#.NET からは Exception クラスではなく、別の例外クラスを投げないといけない
のでしょうか?

どなたかご存知の方いらっしゃいましたら教えていただけないでしょうか?
よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-08 08:27
引用:

VC#.NET からは Exception クラスではなく、別の例外クラスを投げないといけない
のでしょうか?



COM 連携でなくたって、普通は Exception をそのまま投げるような無粋な真似はしません。

.NET の一般的な例外については、COM 連携が適切な COM エラーに変換してくれるので、そのっま投げればよいです。

もっと細かく制御したければ COMException を使います。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2004-12-08 19:05
引用:

渋木宏明(ひどり)さんの書き込み (2004-12-08 08:27) より:
COM 連携でなくたって、普通は Exception をそのまま投げるような無粋な真似はしません。

.NET の一般的な例外については、COM 連携が適切な COM エラーに変換してくれるので、そのっま投げればよいです。

もっと細かく制御したければ COMException を使います。


返信ありがとうございます。
COMException という例外クラスがあるようですが、具体的にどのようにエラー情報を埋め込めばよいのでしょうか?

お手数ですがアドバイスをいただければと思います。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-08 21:56
引用:

COMException という例外クラスがあるようですが、具体的にどのようにエラー情報を埋め込めばよいのでしょうか?



COMException クラスのコンストラクタで、COMException.HResult 値にエラーコードを設定します。

どんなエラーコードを与えるのが適切かは、どんなエラーが発生しているかによって異なります。(だって、発生しているエラーが何であるかを伝えるのが役目ですから)

でも、そんなことが必要なのはよほど珍しいエラーが発生した時です。

通常は

引用:

.NET の一般的な例外については、COM 連携が適切な COM エラーに変換してくれるので、そのっま投げればよいです。



で十分です。

.NET の例外が、どのような COM エラーと対応するかは、ヘルプのどこかに解説があったはずです。(トピック名とか忘れました)


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2004-12-09 13:47
引用:

通常は

引用:

.NET の一般的な例外については、COM 連携が適切な COM エラーに変換してくれるので、そのっま投げればよいです。



で十分です。


プログラム内で発生する例外に関してはC++側で ErrorMessage を取得できるのですが、自分で Exception を生成して投げているケースにおいては「Unknown Exception」となっているようです。
エラーメッセージだけを設定した Exception ではダメということなのでしょうか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-09 14:50
引用:

エラーメッセージだけを設定した Exception ではダメということなのでしょうか?



単純には駄目ですね。

コンテナ側で、コンポーネントの IErrorInfo を扱うようにすればよいのかもしれませんが、私はやったことがないので詳細が分かりません。

COM 連携が自動変換してくれないエラーでも、COM エラーにマップが可能=規定の HRESULT 値なエラーなら、COMException を throw してください。

COM エラーにマップが不可能なエラーについては、前述のようにコンテナ側で努力するか、あまりお勧めではありませんが、HRESULT 値のユーザ定義可能な範囲を使用して COMException を throw することになると思います。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
1

スキルアップ/キャリアアップ(JOB@IT)