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

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

Stesso nome della funzione con gli stessi parametri

Se due o più interfacce IDispatch in un oggetto supportano una proprietà o un metodo dello stesso nome, ad esempio Func1, la chiamata viene determinata usando i criteri seguenti. Se il client ha un puntatore a una delle due interfacce che supportano un metodo denominato Func1 e se l'ambiente di automazione supporta l'accesso alla tabella virtuale, Func1 viene richiamato direttamente tramite l'accesso alla tabella virtuale ADSI.

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

Per altre informazioni e una breve spiegazione sul modo in cui 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 Binding tardivo rispetto all'accesso alla tabella virtuale nel modello di estensione ADSI.

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

  • Se si verifica 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 dual in questa prima estensione abbiano una funzione denominata Func1. L'estensione deve determinare quale func1 deve essere sempre richiamata in Automazione.

Stesso nome della funzione con parametri diversi

La sezione precedente ha illustrato come risolvere i conflitti dei nomi delle funzioni, ovvero i nomi delle funzioni che hanno lo stesso nome della 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 restituire risultati non corretti.

Ad esempio:

  • Extn1 (primo nel Registro di sistema in classe CA - priorità superiore) supporta IInterface1.
  • Extn2 (terzo nel Registro di sistema sotto classe CA – priorità inferiore) supporta IInterface2.
  • IInterface1 supporta Method1(int param1, int param2).
  • IInterface2 supporta Method1(int param1).

Un client ADSI dispone di un puntatore dell'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)" archiviando semplicemente il nome della funzione "Method1" in rgszNames[0], IInterface1::Method1 anziché il desiderato IInterface2::Method1 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 prefissire i nomi delle funzioni con i propri identificatori specifici ed evitare progetti di interfaccia che usano funzioni dello stesso nome, ma parametri diversi.

Se si verifica un conflitto di nomi, i client ADSI possono evitare il problema tramite l'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 della matrice rgszName descritti in precedenza.

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

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