Delen via


Oplossing van conflicten tussen functie-/eigenschapsnamen in Automatisering in Extensies

In dit onderwerp geeft 'object' het object als geheel aan als een ADSI-client het object weergeeft. Dat wil gezegd, ADSI en alle extensies.

Dezelfde functienaam met dezelfde parameters

Als twee of meer dubbele IDispatch interfaces in een object een eigenschap of methode van dezelfde naam ondersteunen, bijvoorbeeld Func1, wordt aanroep bepaald aan de hand van de volgende criteria. Als de client een aanwijzer heeft naar een van de dubbele interfaces die ondersteuning bieden voor een methode met de naam Func1 en als de Automation-omgeving vtable-toegang ondersteunt, wordt Func1- rechtstreeks aangeroepen via ADSI vtable-toegang.

Als een van de bovenstaande voorwaarden onwaar is, worden IDispatch::GetIDsOfNames en IDispatch::Invoke aangeroepen om Func1-aan te roepen.

Zie Late Binding versus Vtable Access in het ADSI-extensiemodelvoor meer informatie en een korte uitleg over hoe een client een aanwijzer kan toevoegen aan een dubbele interface en een beschrijving van de typen omgevingen die vtable-toegang ondersteunen.

Omdat alle extensieobjecten de IDispatch--functies terugleiden naar de aggregator, bepaalt de aggregator welke Func1- wordt aangeroepen. De regels zijn:

  • Als er een interface is en er slechts één is, indien aanwezig, ondersteunt de aggregator (ADSI) een functie met de naam Func1, roept de aggregator zijn eigen Func1-aan.
  • Anders doorloopt de aggregator elk van de extensies, in de volgorde die in het register wordt vermeld, en zoekt de eerste extensie die een functie implementeert die Func1wordt genoemd. Het is mogelijk, maar onwaarschijnlijk is dat meerdere dubbele IDispatch--interfaces in deze eerste extensie een functie hebben die Func1-wordt genoemd. De extensie moet bepalen welke Func1- altijd moet worden aangeroepen in Automation.

Dezelfde functienaam met verschillende parameters

In de vorige sectie is besproken hoe u functienaamconflicten kunt oplossen, dat wil gezegd, functienamen met dezelfde functienaam en dezelfde parameterlijst, zoals getal, type en volgorde, wanneer deze zich in Automation voordoen. Wat gebeurt er als twee functies dezelfde naam hebben, maar verschillende parameters? Als een ADSI-client de functie aanroept met behulp van IDispatch::GetIDsOfNames zonder meerdere namen te gebruiken om de parameters op te geven, kan het ADSI-extensiemodel de functies niet ondubbelzinnig maken. Op basis van het hierboven besproken oplossingsschema heeft de eerste extensie in het register die deze functie ondersteunt via een van de interfaces, de versie van deze functie aangeroepen en kan de aanroep mislukken of onjuiste resultaten opleveren.

Bijvoorbeeld:

  • Extn1 (eerst in het register onder klasse-CA – hogere prioriteit) ondersteunt IInterface1-.
  • Extn2 (derde in het register onder klasse-CA – lagere prioriteit) ondersteunt IInterface2.
  • IInterface1 ondersteunt Method1(int param1, int param2).
  • IInterface2 ondersteunt Method1(int param1).

Een ADSI-client heeft een IDispatch interfaceaanwijzer naar een object van klasse-CA. Het wil IInterface2::Method1aanroepen. Als de client 'pDispatch->GetIDsOfNames(IID_NULL) aanroept, rgszNames, 1, MY_LCID, rgDispId)" door alleen de functienaam 'Method1' op te slaan in rgszNames[0], IInterface1::Method1 in plaats van de gewenste IInterface2::Methode1 wordt aangeroepen en de functie mislukt omdat het aantal parameters anders is.

Om dit probleem te minimaliseren, kunnen extensieontwikkelaars hun functienamen vooraf laten gaan met hun eigen specifieke id's en interfaceontwerpen voorkomen die gebruikmaken van functies met dezelfde naam, maar verschillende parameters.

Als er een naamconflict optreedt, kunnen ADSI-clients het probleem voorkomen door directe vtable-toegang als de interface een dubbele interface is. Als directe vtable-toegang niet mogelijk is, moeten ADSI-clients IDispatch::GetIDsOfNames met meerdere namen aanroepen, waarbij de functienamen en de parameters in de matrix rgszNames eerder beschreven.

Visual Basic 5 roept de functie IDispatch::GetIDsOfNames met meerdere namen niet aan. Dat wil gezegd dat alleen de functienaam wordt doorgegeven aan GetIDsOfNames, maar geen argumenten. Met Visual Basic 5 kunnen gebruikers echter een functie aanroepen door directe vtable-toegang, in plaats van de IDispatch::GetIDsOfNames functie aan te roepen als de interface een dubbele interface is. Ontwikkelaars moeten, indien mogelijk, directe vtable-toegang gebruiken.

Zie voorbeeld voor het oplossen van functienaamconflictenvoor meer informatie over naamconflictoplossing.