拡張機能のオートメーションでの関数名とプロパティ名の競合の解決
このトピックでは、"オブジェクト"は、ADSIクライアントが表示するオブジェクト全体を示します。 つまり、ADSIとそのすべての拡張機能です。
同じパラメーターを持つ同じ関数名
オブジェクト内の2つ以上のデュアルIDispatchインターフェイスが同じ名前のプロパティまたはメソッド Func1をサポートしている場合、呼び出しは次の条件を使用して決定されます。 クライアントがFunc1というメソッドをサポートするデュアルインターフェースの1つへのポインタを持っていて、オートメーション環境がvtableアクセスをサポートしている場合、Func1はADSI vtableアクセスによって直接呼び出される。
上記のいずれかの条件がfalseの場合、IDispatch::GetIDsOfNamesとIDispatch::Invokeが呼び出されてFunc1が呼び出されます。
詳細と、クライアントがデュアルインターフェイスへのポインターを追加する方法と、vtableアクセスをサポートする環境の種類の説明については、 ADSI拡張モデルでの遅延バインディングとvtableアクセスを参照してください。
すべての拡張機能オブジェクトがIDispatch関数をアグリゲーターにリダイレクトするため、アグリゲーターはどのFunc1が呼び出されるかを制御します。 規則は以下のとおりです。
- もし、アグリゲータ(ADSI)の中にFunc1と呼ばれる関数をサポートするインターフェースがあれば、アグリゲータはそれ自身のFunc1を呼び出す。
- それ以外の場合、アグリゲーターは各拡張機能をレジストリに記載されている順序で移動し、Func1という関数を実装する最初の拡張機能を検索します。 この最初の拡張機能の複数のデュアルIDispatchインターフェイスにFunc1という関数がある可能性はありますが、ほとんどありません。 拡張機能では、どのFunc1をAutomationで常に呼び出すかを決定する必要があります。
異なるパラメーターを持つ同じ関数名
前のセクションでは、関数名の競合を解決する方法について説明しました。これは、オートメーションで発生した場合に、同じ関数名と同じパラメーターリスト (数、型、順序など) を持つ関数名です。 2つの関数の名前が同じで、パラメーターが異なる場合はどうなりますか。 ADSIクライアントが複数の名前を使用してパラメーターを指定せずにIDispatch::GetIDsOfNamesを使用して関数を呼び出す場合、ADSI拡張モデルでは関数を明確に区別できません。 上記で説明した解決スキームに基づいて、いずれかのインターフェイスを介してこの関数をサポートするレジストリ内の最初の拡張機能では、この関数のバージョンが呼び出され、呼び出しが失敗するか、正しくない結果が生成される可能性があります。
次に例を示します。
- Extn1 (クラスCAの下のレジストリの最初の優先順位) はIInterface1をサポートしています。
- Extn2 (クラスCAの下のレジストリの3番目の優先順位) はIInterface2をサポートしています。
- IInterface1はMethod1(int param1, int param2)をサポートしています。
- IInterface2はMethod1(int param1)をサポートしています。
ADSIクライアントには、クラスCAのオブジェクトへのIDispatchインターフェイスポインターがあります。 IInterface2::Method1を呼び出す必要があります。 クライアントがrgszNames[0] に関数名"Method1"を格納するだけで「pDispatch->GetIDsOfNames (IID_NULL、rgszNames、1、MY_LCID、rgDispId) 」を呼び出す場合、目的のIInterface2::Method1ではなくIInterface1::Method1が呼び出され、パラメーターの数が異なるため、関数は失敗します。
この問題を最小限に抑えるために、拡張機能の開発者は、独自の特定の識別子を使用して関数名のプレフィックスを付け、同じ名前の関数を使用するインターフェイスの設計を避けることができますが、異なるパラメーター。
名前の競合が発生した場合、インターフェイスがデュアルインターフェイスの場合、ADSIクライアントは直接vtableアクセスによって問題を回避できます。 直接vtableアクセスが不可能な場合、ADSIクライアントは、前に説明した配列rgszNamesのパラメーターと関数名を指定して、複数の名前を持つIDispatch::GetIDsOfNamesを呼び出す必要があります。
Visual Basic 5は、複数の名前を持つIDispatch::GetIDsOfNames関数を呼び出しません。 つまり、関数名だけをGetIDsOfNamesに渡しますが、引数は渡しません。 ただし、Visual Basic 5では、インターフェイスがデュアルインターフェイスの場合に IDispatch::GetIDsOfNames関数を呼び出すのではなく、直接vtableアクセスによって関数を呼び出すことができます。 開発者は、可能であれば直接vtableアクセスを使用する必要があります。
名前の競合解決の詳細については、 関数名の競合を解決する例 を参照してください。