2009-05-24 9 views
1

私はC#コードからcpp COMオブジェクトを消費しています。例外は私のエラーメッセージ、特に、私はCPPに設定された内容のいずれかが含まれていませんしかしC#のCOM例外:

try 
{ 
    var res = myComServer.GetSomething(); 
} 
catch (Exception e) { } 

: 私のC#のコードは次のようになります。

私は、ウェブ上で発見したいくつかの例を踏襲している私のCPP側で

... 
ICreateErrorInfo *pcerrinfo;  
IErrorInfo *perrinfo;  
HRESULT hr;  
hr = CreateErrorInfo(&pcerrinfo);  
pcerrinfo->SetDescription(L"C++ Exception");  
hr = pcerrinfo->QueryInterface(IID_IErrorInfo, (LPVOID FAR*) &perrinfo); 
if (SUCCEEDED(hr))  
{ 
    SetErrorInfo(0, perrinfo); 
    perrinfo->Release();  
} 

pcerrinfo->Release();  
return E_FAIL; // E_FAIL or other appropriate failure code 
... 

私は何も足りませんか? マーシャリング、相互運用機能の作成、またはcomサーバー自体の属性など、これに影響する可能性のあるものは他にありますか?代わりに、例外の種類を引くの

答えて

6

あなたのCOMクラスのサポートISupportErrorInfoしていますか?

+0

+1これは興味深い推測です。私は、Webの中の例が細部にどのように焦点を当てるのか、そしてあなたがISupportErrorInfoであなたのクラスをマークする必要があると言及するのを怠るかも知れません。 –

-1

、このようなCOMExceptionタイプをキャッチ...

try 
{ 
    // COM call 
} 
catch(COMException cEx) 
{ 
    // Check HRESULT here 
} 
+1

COMExceptionはSystem.Exceptionから派生しているため、例外の詳細に関しては違いはありません。これは単なるフィルタです。 –

+0

子クラスには基本クラスより多くの情報があります。 COM例外に対する関連情報。私はあなたの意見を全く理解していません。 –

+1

COMException(またはより正確にはその基底ExternalException)には、ErrorCodeという追加メンバーが1つしかありません。このメンバーには、エラーのHRESULTが含まれています。ただし、HRESULTはSystem.ExceptionのMessageおよびHResultプロパティにも含まれます。 –

2

あなたのクラスがISupportErrorInfoを実装しているとしたら、の後に、のVisual StudioからライブラリをC#プロジェクトにインポートした後でサポートを追加しましたか?

Visual Studioは、ライブラリをインポートするときにCOMライブラリと一度だけ話す必要がある塊を生成します。このため、インポート時にDLLのTypeLibで利用可能な情報に基づいて、 "originalDllName .Interop.dll"という特殊な変換DLLを作成します。

実装の変更は、何度でも変更できます。ライブラリを変更した場合(新しいクラスの追加、インターフェイス定義の変更、クラスによって実装されたiterfacesの変更など)、参照からCOM DLLを削除してから再度インポートする必要があります。 Interop DLLをリフレッシュするために必要です。