object (attributo)
L'attributo di interfaccia [object] identifica un'interfaccia COM. Un elenco di attributi dell'interfaccia che non include l'attributo [object] indica un'interfaccia RPC DCE.
[
object,
uuid(string-uuid)
[ , interface-attribute-list]
]
interface interface-name : base-interface
{
...
}
-
string-uuid
-
Stringa UUID generata dall'utilità Uuidgen. È possibile racchiudere la stringa UUID tra virgolette.
-
interface-attribute-list
-
Altri attributi che si applicano all'interfaccia nel suo complesso.
-
interface-name
-
Nome dell'interfaccia.
-
interfaccia di base
-
Interfaccia COM da cui deriva questa interfaccia. L'interfaccia di base deve essere IUnknown, IDispatch o un'altra interfaccia COM che deriva, direttamente o indirettamente, da IUnknown o IDispatch.
Un elenco di attributi di interfaccia per un'interfaccia COM deve includere l'attributo [uuid], ma non può includere l'attributo [version].
Per impostazione predefinita, la compilazione di un'interfaccia COM con il compilatore MIDL genera i file necessari per compilare una DLL proxy. Questa DLL contiene il codice per supportare l'uso dell'interfaccia COM personalizzata da applicazioni client e server oggetti. Tuttavia, se l'elenco di attributi dell'interfaccia per un'interfaccia COM specifica l'attributo [local] , il compilatore MIDL genera solo il file di intestazione dell'interfaccia.
Il compilatore MIDL genera automaticamente un tipo di dati di interfaccia per un'interfaccia COM. In alternativa, è possibile usare typedef con la parola chiave interface per definire in modo esplicito un tipo di dati di interfaccia. La specifica dell'interfaccia può quindi usare il tipo di dati dell'interfaccia nei parametri di funzione e nei valori restituiti, nei membri struct e nell'unione e in altre dichiarazioni di tipo. L'esempio seguente illustra l'uso di un tipo di dati IStream generato automaticamente:
[
object,
uuid (ABCDEFOO-1234-1234-5678-ABCDEF123456)
]
interface IStream : IUnknown
{
typedef IStream * LPSTREAM;
// Other interface definition statements.
}
In un'interfaccia COM si presuppone che tutte le funzioni membro dell'interfaccia siano funzioni virtuali. Una funzione virtuale ha un puntatore implicito come primo parametro. La tabella delle funzioni virtuali contiene una voce per ogni funzione membro dell'interfaccia.
Le funzioni membro dell'interfaccia oggetto non-[local] devono avere un valore restituito HRESULT o SCODE. Si noti che le versioni precedenti delle funzioni membro MIDL consentono di restituire void. Tuttavia, a partire da MIDL versione 3.0, la restituzione di void genera un errore del compilatore. La presenza di un valore restituito HRESULT o SCODE significa che se viene generata un'eccezione durante una chiamata remota, i proxy generati intercettano l'eccezione e restituiscono il codice di eccezione nel valore restituito. Se l'applicazione può permettersi di ignorare gli errori che si verificano durante una chiamata di procedura remota, è possibile specificare HRESULT come tipo restituito senza controllare il valore restituito dopo la chiamata.
Se si ricompila un'applicazione precedente, la modifica dei tipi restituiti può introdurre problemi di compatibilità con le versioni precedenti quando il server invia il risultato appena introdotto al client. In alternativa alla modifica del tipo restituito, è possibile etichettare la funzione che restituisce void con l'attributo [call_as] , rendendola quindi una funzione locale. Definire quindi una funzione remota correlata con gli stessi parametri, ma con il tipo restituito HRESULT. La funzione locale può generare un'eccezione in base al valore HRESULT, se necessario.
L'attributo [object] non è disponibile quando si esegue la compilazione usando l'opzione /osf del compilatore MIDL.
[
uuid(12345678-1234-1234-1234-123456789ABC),
object
]
interface IMyInterface : IUnknown
{
// Interface definition statements.
}
[
uuid(87654321-1234-1234-1234-123456789ABC),
object,
local
]
interface ILocalInterface : ISomeOldCOMInterface
{
// Interface definition statements.
}