2010-05-14 12 views
5

Una doppia interfaccia in COM è quella a cui è possibile accedere tramite una DispInterface o tramite metodi VTable.Interfacce doppie COM

Ora qualcuno può dirmi qual è esattamente qual è la differenza tra i due metodi?

Ho pensato che un VTable è una tabella virtuale che contiene i puntatori alle diverse funzioni quando implementa una gerarchia di classi che ha funzioni virtuali che possono essere sovrascritte nelle classi child. Tuttavia non vedo come questo è collegato a una doppia interfaccia in COM?

risposta

2

In breve, COM è una specifica binaria, non una specifica del linguaggio. Non c'è davvero una correlazione tra le due interfacce e le classi derivate nel codice. Mele e arance

Il VTable è "anticipato" e quindi più veloce. Conosci il tipo di metodo che stai chiamando in fase di compilazione.

L'uso di DispInterface è "late bound" ed è quindi più lento, ma più flessibile. È ampiamente utilizzato per lo scripting. Il metodo e i tipi di proprietà sono determinati in fase di esecuzione.

Spero che questa breve spiegazione aiuti.

+0

Che cosa intendi esattamente con "specifica binaria"? –

+2

@Tony: significa che COM indirizza solo il modo in cui i componenti comunicano a livello binario: non dice nulla su come sono sviluppati i componenti o su quale lingua è scritto il codice o se esiste una "gerarchia di classi". Vedere Il modello a oggetti del componente: una panoramica tecnica @ http://msdn.microsoft.com/en-us/library/ms809980.aspx –

+0

+1 per l'associazione anticipata e tardiva. –

3

La differenza principale è nel modo di chiamare i metodi dell'oggetto. Nel caso della chiamata DispInterface passa attraverso il metodo IDispatch :: Invoke (utilizzato negli script o in assenza della descrizione dell'interfaccia), vedere remarks. Questo metodo è una seconda opzione molto più lenta. Nel secondo caso utilizzato direttamente VTable per le chiamate di metodo (utilizzato per le chiamate da C + + o. NET lingue)

+0

Quindi il metodo invoke su IDispatch viene utilizzato per richiamare metodi da uno script come VBScript o JScript? –

+0

@Tony Correct - se si desidera che l'oggetto COM sia utilizzabile da uno script, è necessaria una doppia interfaccia. –

+1

Sì, quando sei nello script chiama un metodo, prima chiama IDispatch :: GetIDsOfNames e quindi IDispatch :: Invoke – Victor

1

Voglio solo rispondere a ulteriori domande di Tony.

Se si desidera creare un COM che può essere accessibile da VBScript/JScript o dal vecchio ASP "classico", è necessario implementare IDispatch.

In Visual Basic 6 o VBA di MS Office è possibile utilizzare entrambi i modi. Se aggiungi Reference al tuo COM, allora userai "early bound" (IUnknown o VTable). Se si utilizza la COM in VB6 o VBA con CreateObject ("ProgIdName"), verrà utilizzato "late bound".

È molto importante capire che per rendere COM accessibile da VB6/VBA ect. non è sufficiente implementare l'interfaccia IUnknown. Devi creare e registrare Type Library con l'attributo oleautomation. Per essere in grado di farlo, è possibile utilizzare nell'interfaccia del proprio COM solo i tipi di dati compatibili oleautomation (vedere http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspx). Per comprendere la libreria dei tipi è necessario un client di marshalling DLL, quindi è utile un software client come VB6/VBA per inviare correttamente i dati come parametri al COM. Non dovresti dimenticare che anche il tuo COM sarà un server InProc, una DLL, i parametri non saranno in avanti direttamente su COM, ma devono essere sottoposti al marshalling. Durante il marshalling verrà creata una copia dei dati sul thread su cui viene eseguito il COM. Rende sicuro il thread DLL COM da un lato e COM non si arresta in modo anomalo se il thread che chiama il metodo COM verrà terminato prima che COM restituisca il valore.

Probabilmente la mia spiegazione sul marshalling non è semplice, ma è importante non dimenticare di creare e registrare la libreria dei tipi che è meglio salvare come risorsa all'interno di COM.