Risoluzione dei conflitti di nomi di funzione/proprietà in Automazione nelle estensioni

In questo argomento "object" indica l'oggetto, nel suo complesso, come viene visualizzato da un client ADSI. Ovvero, ADSI e tutte le sue estensioni.

Stesso nome di funzione con gli stessi parametri

Se due o più interfacce IDispatch duali in un oggetto supportano una proprietà o un metodo con lo stesso nome, ad esempio Func1, la chiamata viene determinata usando i criteri seguenti. Se il client dispone di un puntatore a una delle interfacce duali che supportano un metodo denominato Func1 e se l'accesso vtable di Automazione supporto ambientale s, Func1 viene richiamato direttamente tramite l'accesso alla tabella virtuale ADSI.

Se una delle condizioni precedenti è false, vengono chiamati IDispatch::GetIDsOfNames e IDispatch::Invoke per richiamare Func1.

Per altre informazioni e una breve spiegazione su come un client può aggiungere un puntatore a un'interfaccia doppia e una descrizione dei tipi di ambienti che supportano l'accesso alla tabella virtuale, vedere Associazione tardiva rispetto all'accesso Vtable nel modello di estensione ADSI.

Poiché tutti gli oggetti di estensione reindirizzano le funzioni IDispatch all'aggregatore, i controlli aggregatori richiamati da Func1. Le regole sono:

  • Se è presente un'interfaccia e ne sarà presente una sola, se presente, nell'aggregatore (ADSI) supporta una funzione denominata Func1, l'aggregatore richiama il proprio Func1.
  • In caso contrario, l'aggregatore passa attraverso ognuna delle relative estensioni, nell'ordine elencato nel Registro di sistema e trova la prima estensione che implementa una funzione denominata Func1. È possibile, ma improbabile, che più interfacce IDispatch duali in questa prima estensione abbiano una funzione denominata Func1. L'estensione deve determinare quale Func1 deve sempre essere richiamata in Automazione.

Stesso nome di funzione con parametri diversi

La sezione precedente ha illustrato come risolvere i conflitti di nomi di funzione, ovvero i nomi di funzione con lo stesso nome di funzione e lo stesso elenco di parametri, ad esempio numero, tipo e ordine, quando si verifica in Automazione. Cosa accade se due funzioni hanno lo stesso nome ma parametri diversi? Se un client ADSI richiama la funzione usando IDispatch::GetIDsOfNames senza usare più nomi per specificare i parametri, il modello di estensione ADSI non può disambiguare le funzioni. In base allo schema di risoluzione descritto in precedenza, la prima estensione nel Registro di sistema che supporta questa funzione tramite una delle relative interfacce ha la versione di questa funzione richiamata e la chiamata potrebbe non riuscire o produrre risultati non corretti.

Ad esempio:

  • Extn1 (primo nel Registro di sistema con ca di classe - priorità più alta) supporta IInterface1.
  • Extn2 (terzo nel Registro di sistema sotto la classe CA - priorità inferiore) supporta IInterface2.
  • IInterface1 supporta Method1(int param1, int param2).
  • IInterface2 supporta Method1(int param1).

Un client ADSI ha un puntatore all'interfaccia IDispatch a un oggetto della CA di classe. Vuole richiamare IInterface2::Method1. Se il client chiama "pDispatch-GetIDsOfNames>(IID_NULL, rgszNames, 1, MY_LCID, rgDispId)" semplicemente archiviando il nome della funzione "Method1" in rgszNames[0], IInterface1::Method1 anziché l'IInterface2::Method1 desiderato viene richiamato e la funzione ha esito negativo perché il numero di parametri è diverso.

Per ridurre al minimo questo problema, gli sviluppatori di estensioni possono anteporre i propri nomi di funzione con identificatori specifici ed evitare progettazioni di interfacce che usano funzioni con lo stesso nome, ma parametri diversi.

Se si verifica un conflitto di nomi, i client ADSI possono evitare il problema tramite accesso diretto alla tabella virtuale se l'interfaccia è un'interfaccia doppia. Se l'accesso diretto alla tabella virtuale non è possibile, i client ADSI devono chiamare IDispatch::GetIDsOfNames con più nomi, specificando i nomi delle funzioni e i parametri nelle matrici rgszName descritte in precedenza.

Visual Basic 5 non chiama la funzione IDispatch::GetIDsOfNames con più nomi. Ovvero passa solo il nome della funzione a GetIDsOfNames, ma non agli argomenti. Visual Basic 5 consente tuttavia agli utenti di richiamare una funzione tramite accesso diretto alla tabella virtuale, anziché richiamare la funzione IDispatch::GetIDsOfNames se l'interfaccia è un'interfaccia doppia. Se possibile, gli sviluppatori devono usare l'accesso diretto alla tabella virtuale.

Per altre informazioni sulla risoluzione dei conflitti dei nomi, vedere Esempio di risoluzione dei conflitti di nomi di funzione.