none
HRESULT値からVB6のErr.Number値に変換したい RRS feed

  • 質問

  • C#で作成したサンプルコードでエラーの発生事象を探り、その結果をVB6で書いているプログラムへと反映させたいと考えています。

    try-catch構文で得たExceptionからMarshal.GetHRForException()関数を使用してHRESULT値は得られたのですが、このHRESULT値からVB6のErr.Numberで得られるのと同じ値を得る方法がわかりません。

    「HRESULT は 32 ビットの値で、重大度コード、機能コード、およびエラーコードの 3 つのフィールドに分けられます。」と言うのですが、HRESULTを3つのフィールドに分ける方法が見つけられませんでしたし、また、分けた結果のエラーコードがErr.Numberの値と同値になるのかもわかりませんでした。

    ご存知の方、そもそもできるのかどうか、そしてできるのであればそのやり方を教授願えませんでしょうか。

    2011年8月19日 10:12

回答

すべての返信

  • エラー コードとして HRESULT 値が得られたのであれば、Err.Number とか関係なくその値を解釈するしかないと思います。
    解釈の方法は次の URL あたりを参照すると分かるのではないかと。

    Interpreting HRESULT Values
    http://msdn.microsoft.com/en-us/library/bb401631.aspx

    Winerror.h: Part 1
    http://msdn.microsoft.com/en-us/library/ms819773.aspx

    次の記事にあるように、場合によっては HRESULT 値を WIN32 のエラーコードに変換できる場合もあります。(こちらは LastDllError に当たるのかな。)

    How do I convert an HRESULT to a Win32 error code? - The Old New Thing - Site Home - MSDN Blogs
    http://blogs.msdn.com/b/oldnewthing/archive/2006/11/03/942851.aspx

    HRESULT 値を自力で解釈してみて「トラップできるエラー」に当てはまるのがあれば、t.nishii さんが想像される Err.Number 値にマップできるかもしれません。
    (「トラップできるエラー」は VB6 のヘルプに載っていると思います。)

    参考:
    Visual Basic でトラップできるエラー
    http://msdn.microsoft.com/ja-jp/library/ms234761(VS.80).aspx

    アプリケーションの Visual Basic でトラップできるエラーについて
    http://support.microsoft.com/kb/142138/ja


    • 回答としてマーク t.nishii 2011年8月22日 1:00
    2011年8月19日 11:47
  • VB.NETにもVB6の互換機能としてErr.Numberが用意されています。ただし完全ではなくErr.Number によって返される値が異なる場合があるそうです。

    これは普通には使えませんが、無理やりC#から使ってErr.Number値を得ることはできますが…紹介してもいいものかどうか。

    それよりもなぜErr.Numberが必要なのか、なぜVB.NETでコードを書かないのか、他の値で代用できないのか。というかそもそもどんなエラーの時にどのような数値になるのか、t.nishiiさん自身把握できていないんですよね?

    • 回答としてマーク t.nishii 2011年8月22日 1:00
    2011年8月19日 22:58
  • 返信ありがとうございます。

    VB6で書かれているソフトがあり、そのコード内のエラートラップでErr.Numberの値で分岐させている部分があるのですが、この分岐条件が適切かどうかを確認し、もし不適切な部分があれば修正を行いたい というのが本来の目的です。

    C#のテストコードで確認できたエラーがあり、Exception.Messageプロパティで発生事象も分かったのですが、このエラーがVB6のErr.Numberでいくつになるのかが分からず、分岐条件の確認・修正に結びついていない というのが現状です。

    教えて頂いたErrObject.Numberを試してみたいと思います、ありがとうございました。

    2011年8月22日 0:46
  • 返信ありがとうございます。

    示して頂いたURLを確認させて頂きたいと思います。

    エラーの種類としてはHRESULTのほうがErr.Numberより多いでしょうから、HRESULTをそのまま解釈する方がより詳細なのでしょうね。

    また、Visual Basicでトラップできるエラーについての情報は、今回の事に限らず使えそうです。

    ありがとうございました。

    2011年8月22日 1:00