どのように戻したいの両方にエラー文字列、エラーコードをVB6からATL activexコントロールのツールか?
-
21-08-2019 - |
質問
監督-選手コメンを返し詳細なエラーがVB6用 CComCoClass::エラー, うですが、できるだけが返されます。エラーコード/または/メッセージがない。
return Error(_T("Not connected"), __uuidof(IMyInterface), HRESULT_FROM_WIN32(ERROR_CONNECTION_INVALID));
結果の一般的方法"の要求のオブジェクト'IMyInterface'失敗した"というエラーメッセージにErr.Descriptionは、VB6側がERROR_CONNECTION_INVALIDにErr.番号を
return Error(_T("Not connected"));
結果、適切なエラーメッセージが、汎用エラーコードErr.ます。どうすれば両方の長所?
解決
できない、これによりデザイン。詳細をさらに下が短いの三つのオプション:
- 戻りのないメッセージおよびVB優COM誤らないこと、すなわち一つ 知られて によるトの実行時にこの KB第;トのランタイム翻訳のこCOM誤差"をVBプラスエラーメッセージ。
- 返すエラーメッセージおよびDISP_E_EXCEPTION;トの実行時の通りこのサーバーエラー"とカスタムエラーメッセージを表示します。この暗黙のうちに起きている第二の例では、詳細は以下をご参照ください。
- 戻りのないメッセージおよびその他のCOM誤らないこと、すなわち一つ 知らない のVB runtime;トの実行時のままのリゾートの原HRESULTプラス汎用メッセージ"
Method '~' of object '~' failed
".- なお、この実行時の挙動はも適用された場合、い供給エラーメッセージ、すなわちメッセージそのまま無視される!ここでは何が起こって初めての例では、詳細は以下をご参照ください。
本例題ではあげたの選択
- したい場合は供給の文脈に照ら正しい'COMの誤り'の自動化取引先様VB(とうき)きを省略するかカスタムエラーメッセージが返されます。
- 場合に供するカスタムエラーメッセージの"サーバーの誤差(カスタムエラー条件に関する機能 以内 ご自サーバオプションはDISP_E_EXCEPTION.
詳細
トの実行時のと考えられるのだけに制限されて取扱いについてCOMます。その歴史的および/または技術上の理由により特定のVB実施していないのはこちらキーワードがIDispatchみvsデュアルタActiveXとしてサブセットのCOM).
しかできない表面の明示的な仕様のための行動の概要上記では図から掘削を通じてその他の資料
[...]通話中に GetErrorInfo方法を取得する 可能エラー情報です。の 実行してかどうかを判定し bstrDescriptionの値以外 NULLになります。場合、ランタイムを見つける価値 以NULLの場合は、[...]、原HRESULT の値が使用されるこのシナリオ。の場合 ランタイムがNULL値は、[...] Visual BasicしHRESULT に、対応する視覚 基本的なエラーになります。
この挙動に関するお拳例:きかった供給エラーメッセージ、そのためにランタイムだけでリゾートには汎用のメッセージ"Method '~' of object '~' failed
"プラスお HRESULT
.
の挙動を第二の例も整合的に一度見の定義(第listed)コンストラクタ CComCoClass::Error
:このデフォルトの指定されたパラメータは、特に'hRes=0'.の'備考'セクションの更なる国"の場合hResはゼロとなり、その後のバージョンのエラーを返しDISP_E_EXCEPTION.".そのため、この暗黙のうちにトリガーのサーバーのエラー'パスを通して行動です。
最後に、具体的なC++実装サンプルのVBなどの自動化お客様の行動を入手している。項'エラー処理"とそれに続く"運動とし、5'に 自動化Microsoft Office97は、Microsoft Office2000年.
他のヒント
ISupportErrorInfoImplからあなたのCOM-公開されたインターフェースを実装するクラスを派生させ、いずれかが発生した場合は、エラーの詳細な説明を設定するのSetErrorInfoを呼び出します。あなたのクラスのCOM_MAPにISupportErrorInfoを含めることを忘れないでください。
私も今、この権利に苦しんでいます。これまでのところ、私の掘削は、エラーコードが実際にHRESULT値であることを示しています。 VB6はスマートにし、HRESULTを解釈しようとしますが、それは理解のHRESULTのかなり限定されたリストを持っているようです。 HRESULT VB6が精通していないために、それだけでErr.NumberにプロパティにHRESULTを置き、開発者はそれをどうするかを把握するために十分にスマートであることを期待しています。
私はエラー番号を返すに来て一番近い私が欲しいものに設定HRESULTのコードフィールドとHRESULT、重要度フラグをセットし、私は右の施設である希望を生成するMAKE_SCODEを使用することです。
CreateErrorInfoとのSetErrorInfoと一緒に私のエラーコードとVB6でのエラーの説明を取得すること。そして、それはエラーの限定されたリストとスマートになろうとして戻っVB6に私たちをもたらします。
この記事 http://support.microsoft.com/kb/827994 にチェックアウト。だからあなたのオブジェクトは、S_OKを返すメソッドISupportsErrorInfo :: InterfaceSupportsErrorInfo()を実装する必要があります。その後、復帰する前に、あなたは、IErrorInfoを実装するCOMオブジェクト::のgetDescription()へのポインタでのSetErrorInfoを呼び出す必要があります。 ここでの例があります: http://msdn.microsoft.com/en-us/library/ms221409。 ASPX でます。
あなたが復帰する前のSetErrorInfo場合、VBは、あなたがのSetErrorInfoに渡されたオブジェクトポインタののgetDescriptionメソッドを照会します。
私は定型コードの多くは、常に確実に、より生のCOMを使用してテストすることを好む - -私はあなたが使用している帰属コードで深すぎていないですが、少なくともそれは、あなたの代わりに、洗練されたラッパーを使用することができ、動作しますこれます。