2017-01-17 2 views
1

私はcomの取り扱いに関して質問があります。comのバージョンで既存の関数は処理できません

私は引数としてnamed_guidsを使用して、#importを使用してサードパーティ製のDLLを使用しています。適切なインポートのために別の引数を使うべきかどうかは分かりません。

問題は、dllのバージョンが異なることです。私が使用している特定の関数の1つが、dllの最後のバージョンで追加されています。したがって、コスモマーが古いバージョンを持っている場合、例外アクセス違反実行ロケーション(あるアドレス)があります。関数が見つからないというエラーが表示されていますが、この例外をキャッチする方法は分かりますか?

私はのtry-catch(_com_error)で試してみました - 何も、のtry-catch(STD ::例外) - 何でものtry-catch(...) - まだ何も。

この種の例外をキャッチし、例外をログに記録して、DLLに問題があることをコース担当者に伝えることはできますか?

私はLoadLibraryとGetProcAddressで作業していません。

答えて

0

第三者DLLの開発者はCOMのコア原則に違反しました:インターフェイスは不変です。これは、いったん公開されると、インタフェースが変更されない可能性があることを意味します。このルールに従わないと何が起こるのかが分かります。存在しないメソッドを呼び出すとアクセス違反が発生します。

COMインターフェイスがIDispatchから派生している場合は、メソッドが存在するかどうかを簡単に確認できます。GetIDsOfNamesを使用してメソッドのDISPIDを取得します。存在しない場合は、DISP_E_UNKNOWNNAMEエラーが返されます。

DISPID dispID; 
BSTR methodName = SysAllocString(L"MyMethod"); 
// Check hr return value 
HRESULT hr = piDisp->GetIDsOfNames(IID_NULL, &methodName, 1, LOCALE_SYSTEM_DEFAULT, &dispID); 
SysFreeString(methodName); 
+0

ありがとうございます:)これは私が必要なものです。 – Alek

+1

@Alexの場合、サードパーティの開発者にこのルールを破るための大きな噛み合わせを与えるべきです。これは、文字通り、COMでインターフェイスを作成する方法について最初に学んだことです。言い訳はありません。 –

関連する問題