2017-05-19 51 views
0

COMを介してDelphiで書かれたアプリケーションと通信するC#-written Webアプリケーションがあります。 C#アプリケーションは、必要なデータを取得するためにDelphiアプリケーションのメソッドを呼び出します。 COMExceptionは、Delphiアプリケーションで問題が発生したときにC#コードにスローされます。ここで元のCOMExceptionの例外を特定する方法

COMExceptionの詳細は以下のとおりです。

enter image description here

問題:私たちは、Delphi、例外のタイプに依存これらの例外を処理します。しかし、毎回COMExceptionであるため、できません。

質問:元のタイプのDelphi例外をC#コードでどのように識別またはマップできますか?

+1

元の例外を強力なものに戻してDelphiで処理する方がよい場合は、Delphiコードを編集できますか? –

+0

Delphiで処理したくありません。私たちはC# - サイドでそれを処理したい。 – Simon

+2

@JeremyThompsonが正しいです。例外をアプリケーションやDLLから別の言語で書かれた実行ファイルにエスケープさせないでください。明らかにC#は何とかDelphiの例外を処理できますが、明らかに元のデータは(主に)失われます。それをしないでください。可能であれば、Delphiで例外を処理し、例外の種類やメッセージに関する情報を他の方法で渡します。 –

答えて

0

この目標を達成するには、Marshal.ThrowExceptionForHRメソッドを使用する必要があります。 必要に応じてカスタムHRコードの結果によって拡張することができます。ここで

はサンプルコードです:

try 
    { 
     ... 
    } 
    catch (COMException exception) 
    { 
     switch (exception.HResult) 
     { 
      case -2147418113: 
       throw new MissingFolderException("Custom exception"); 
     } 

     Marshal.ThrowExceptionForHR(exception.HResult); 
    } 

MissingFolderExceptionは、あなたのコードで実装もちろん、特定の例外です。

いくつかの詳細はここにある:How to: Map HRESULTs and Exceptions

は、Delphiコードは(HRESULTが異なる2つの例外についても同様である)いくつかのシナリオでは明確な例外を返しませんが、その後、Delphiのコードを変更する必要があります発生する可能性があります。

関連する問題