2013-05-08 5 views
6

私は答えをチェックアウトしました:How can I return both an error string and error code to VB6 from an ATL activex control?ATLからVB6へ肯定的なエラーコードを返す方法は?

カスタム負のエラーコード、つまり重大度ビットセットとカスタムエラーメッセージを返すことができました。しかし、私は、VB6がErr.Numberのための陽性#として提示するコードを生成できるようにしたいと思います。私はかなりそれがMicrosoftのDAO 3.6 DLLができるようになることができると確信しています。たとえば、Err.Number = 3078 Err.Description "Microsoft Jetデータベース..."テーブルが存在しない場合、返します。

エラー報告用にISupportErrorInfoなどを実装しています。

答えて

5

Markの答えに少し注釈を付ける。彼はFACILITY_CONTROLの使用について正しいです。さらに、VB6ランタイムエラーコードを妨げないように、エラーコードが512より大きいことを確認する必要があります。したがって、このようなものを使用してください:

HRESULT MakeVB6Error(UINT errCode) { 
    assert(errCode > 0 && errCode < 65536 - 513); 
    return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CONTROL, errCode + 513); 
} 
+0

ありがとうございました、FACILITY_CONTROLを使ってトリックをやった! – veneff

+0

C#から同じことをする方法についても同様の答えがあります(Google経由で取得する場合):[C#からCOM interop経由でVBスタイルエラーコードを生成](http://stackoverflow.com/a/32868308/) 588306) – Deanna

4

VBは、HRESULT値をErr.Number値に多くマッピングします。 HRESULTが0x8007002た場合例えば、VBは次のようにCOMの標準を使用してそれらを破壊する:

Bit 31 - Severity (set to 1 in all errors) 
Bit 30 - Reserved 
Bit 29 - Customer Bit 
Bit 28 - Reserved 
Bit 27 
    - 16 Facility code 
Bit 15 
    - 0 Error code 

実際には、トップニブルは、施設が変動常に8であり、これがあると、エラーのあなたはどのようなタイプを伝えます。この場合、ファシリティコードは0x007(FACILITY_WIN32)です。これは、これが標準のWin32エラーであることを意味します。下の2バイトは実際のエラーを表します。 winerror.hを見ると、このエラーは2-ERROR_FILE_NOT_FOUNDです。 VBは、このエラーを標準のVBエラー53 "ファイルが見つかりません"にマップするのに十分なほど巧妙です。

VBのドキュメントでは、VBコンポーネントから定数を呼び出す際に、定数vbObjectErrorをエラー番号に追加することを常に推奨しました。これは、エラー番号(0x= 65535と仮定)と32ビットの整数0x80040000をORすることとほぼ同じでした。この場合、ファシリティコードは0x4(FACILITY_ITF)で、これはコクラスの特定のインターフェイスからエラーが発生したことを示しています。実際には、これは私たちのエラー番号を大きく、負にし、理解しにくいものにしました。

本当にすべきことは、ドキュメントを無視し、まっすぐなエラー番号を上げることでした。背後では、VB OR'd独自のファシリティコード - 0xA(FACILITY_CONTROL)。しかし、そのファシリティコードを持つHRESULTを参照するVBコンポーネントであれば、上位2バイトが自動的にクリアされるため、その数値は負ではなく正であると見なされます。

自分のエラー番号にFACILITY_CONTROLを使用することをお勧めします。他のCOMクライアントは混乱する可能性がありますが、VBクライアントはエラー番号を肯定的なものと見なします。

また、戻り値の通常のHRESULTメカニズムを無視することもできます。代わりにHRESULT = S_OKを返し、関数の最後に[retval、out]パラメータを使用して、VB関数であるかのように見せます。

+0

ありがとうございました、FACILITY_CONTROLを使ってトリックをしました! – veneff

関連する問題