2010-11-19 17 views
2

COM呼び出し可能ラッパー/ COM Interopを介して公開しているExcel VBAからC#DLLが呼び出されています。私は、VBAクライアントにC#のコードで発生する例外を渡すことができるようにしたい。これを行うための推奨される方法はありますか?ありがとう。C#/ VBA COM Interopでのエラー処理

答えて

0

年前私はCOM関数呼び出しに関するエラー情報を返す漠然とした思い出を持っています。 COM関数は例外を返すべきではありません。 COM関数でエラーが発生したという事実は、戻り値によって通知されます。 S_OK(0)は成功を意味しました。負の数は失敗を意味します。異なるエラー番号を使用して基本エラータイプを渡すこともできますが、より具体的なエラー情報については、COMオブジェクトにIErrorInfoインターフェイスを実装する必要がありました。

このようにして、Visual Basic 6.0とVisual Studio 2000はVisual BasicではCOMエラーをうまく処理しましたが、VBAの古いバージョンでは問題ありませんでした。

誰かがCOMをもっと最近使ったことがある人は、詳細を記入し、私の記憶が何年も曇っている場所を修正できるかもしれません。

例外をドキュメント化されたCOMエラーに変換する新しいCOMラッパーコードを実装するのは簡単な一般的なことではなく、手作業でコード化されたバージョンを作成することもできますが、COMプログラミングを理解する必要があります。

.NETオブジェクトを再設計して、オブジェクト内でgetlasterror()メソッドを呼び出すことによってエラーの詳細を報告できるようにすることは、賢明な回避策になります。

2

HRESULTエラーコードをVBAまたは他のCOMベースの発信者に返信する独自​​の例外を作成することは可能です。

public class ComMessageException : Exception 
{ 
    public ComMessageException(string message) 
     :base(message) 
    { 
     HResult = unchecked((int)0x80004005); 
    } 
} 

Here is an MSDN articleプロセスを説明しています。ここではE_FAILを使用する例を示します。

VB6で同じVBAエラーをサポートする必要があります。選択したHRESULTとともに、選択したエラーメッセージがユーザーに表示されます。