dispinterface (attributo)
L'istruzione dispinterface definisce un set di proprietà e metodi su cui è possibile chiamare IDispatch::Invoke. Una dispinterface può essere definita elencando in modo esplicito il set di metodi e proprietà supportati (sintassi 1) o elencando una singola interfaccia (sintassi 2).
[
[attributes]
]
dispinterface dispinterface-name
{
properties:
property-list
methods:
method-list
};
[
[attributes]
]
dispinterface dispinterface-name
{
interface interface-name
};
Parametri
-
attributes
-
Specifica gli attributi che si applicano all'intera interfaccia dispinterfaccia. Vengono accettati gli attributi seguenti: [helpstring], [helpcontext], [helpfile], [hidden], [nonextensible], [oleautomation], [restricted], [uuid]e [version].
-
dispinterface-name
-
Nome in base al quale la dispinterface è nota nella libreria dei tipi. Questo nome deve essere univoco all'interno della libreria dei tipi.
-
property-list
-
(Sintassi 1) Elenco facoltativo di proprietà supportate dall'oggetto, dichiarato sotto forma di variabili. Questo è il formato breve per dichiarare le funzioni di proprietà nell'elenco dei metodi. Per informazioni dettagliate, vedere la sezione dei commenti.
-
method-list
-
(Sintassi 1) Elenco che comprende un prototipo di funzione per ogni metodo e proprietà nella dispinterface. Qualsiasi numero di definizioni di funzione può essere visualizzato nell'elenco dei metodi. Una funzione in methlist ha il formato seguente:
[attributi]returntype methname type paramname(params);
Gli attributi seguenti vengono accettati in un metodo in un dispinterface: [helpstring], [helpcontext], [propget], [propput], [propputref], [string]e [vararg]. Se viene specificato [vararg] , l'ultimo parametro deve essere una matrice sicura di tipo VARIANT .
L'elenco di parametri è un elenco delimitato da virgole, ognuno dei quali ha il formato seguente:
[attributi]
Il tipo può essere qualsiasi tipo dichiarato o predefinito o un puntatore a qualsiasi tipo. Gli attributi sui parametri sono:
[in], [out], [facoltativo], [string]
-
interface-name
-
(Sintassi 2) Nome dell'interfaccia da dichiarare come interfaccia IDispatch.
Commenti
Il compilatore MIDL accetta l'ordinamento dei parametri seguente (da sinistra a destra):
- Parametri obbligatori (parametri che non hanno gli attributi [defaultvalue] o [facoltativo]),
- parametri facoltativi con o senza l'attributo [defaultvalue],
- parametri con l'attributo [facoltativo] e senza l'attributo [defaultvalue],
- [ lcid] parametro, se disponibile,
- [ retval] parametro
Le funzioni del metodo vengono specificate esattamente come descritto nella pagina di riferimento per il modulo , ad eccezione del fatto che l'attributo [ entry] non è consentito. Si noti che STDOLE32. TLB (STDOLE. TLB nei sistemi a 16 bit) deve essere importato, perché una dispinterface eredita da IDispatch.
È possibile dichiarare le proprietà negli elenchi di proprietà o metodi. La dichiarazione delle proprietà nell'elenco delle proprietà non indica il tipo di accesso supportato dalla proprietà , ovvero get, put o putref. Specificare l'attributo [ readonly] per le proprietà che non supportano put o putref. Se si dichiarano le funzioni di proprietà nell'elenco dei metodi, le funzioni per una proprietà hanno tutti lo stesso identificatore.
Usando la prima sintassi, sono necessari i metodi e le proprietà: i tag. L'attributo [ id] è necessario anche per ogni membro. Ad esempio:
properties:
[id(0)] int Value; // Default property.
methods:
[id(1)] HRESULT Show();
A differenza dei membri dell'interfaccia, i membri dispinterface non possono usare l'attributo retval per restituire un valore oltre a un codice di errore HRESULT. L'attributo [ lcid] non è valido per i caratteri dispinterfaces, perché IDispatch::Invoke passa un LCID. Tuttavia, è possibile ripetere la richiesta di un'interfaccia che usa questi attributi.
Usando la seconda sintassi, le interfacce che supportano IDispatch e vengono dichiarate in precedenza in uno script ODL possono essere dichiarate nuovamente come interfacce IDispatch come indicato di seguito:
dispinterface helloPro
{
interface hello;
};
Nell'esempio precedente vengono dichiarati tutti i membri di hello e tutti i membri che hello ereditano come IDispatch di supporto. In questo caso, se hello fosse dichiarato in precedenza con membri [lcid] e [retval] che hanno restituito HRESULTs, MkTypLib rimuoveva ogni parametro [lcid] e il tipo restituito HRESULT e contrassegnava invece il tipo restituito come quello del parametro [retval].
Nota
Lo strumento Mktyplib.exe è obsoleto. Usare invece il compilatore MIDL.
Le proprietà e i metodi di una dispinterface non fanno parte del VTBL della dispinterface. Di conseguenza, Non è possibile usare CreateStdDispatch e DispInvoke per implementare IDispatch::Invoke. La dispinterface viene usata quando un'applicazione deve esporre le funzioni non VTBL esistenti tramite Automazione. Queste applicazioni possono implementare IDispatch::Invoke esaminando il parametro dispidMember e chiamando direttamente la funzione corrispondente.
Esempi
[
uuid(1e196b20-1f3c-1069-996b-00dd010fe676),
version(1.0),
helpstring("Useful help string."),
helpcontext(2480)
]
dispinterface MyDispatchObject
{
properties:
[id(1)] int x; //An integer property named x
[id(2)] BSTR y; //A string property named y
methods:
[id(3)] HRESULT show(); //No arguments, no result
[id(11)] int computeit(int inarg, double *outarg);
};
[
uuid(1e123456-1f3c-1069-996b-00dd010fe676)
]
dispinterface MyObject
{
properties:
methods:
[id(1), propget, bindable, defaultbind, displaybind] long x();
[id(1), propput, bindable, defaultbind,
displaybind] HRESULT x(long rhs);
}
Vedere anche