dispinterface (attribut)
L’instruction dispinterface définit un ensemble de propriétés et de méthodes sur lesquelles vous pouvez appeler IDispatch :: Invoke. Une dispinterface peut être définie en répertoriant explicitement l’ensemble des méthodes et des propriétés prises en charge (syntaxe 1), ou en répertoriant une seule interface (syntaxe 2).
[
[attributes]
]
dispinterface dispinterface-name
{
properties:
property-list
methods:
method-list
};
[
[attributes]
]
dispinterface dispinterface-name
{
interface interface-name
};
Paramètres
-
attributes
-
Spécifie les attributs qui s’appliquent à l’ensemble de dispinterface. Les attributs suivants sont acceptés : [ helpString ] , [ HelpContext ] , [ HelpFile ] , [ Hidden ] , non [ extensible ] , [ oleautomation ] , [ Restricted ] , [ UUID ] et [ version ] .
-
dispinterface-nom
-
Nom par lequel la dispinterface est connue dans la bibliothèque de types. Ce nom doit être unique dans la bibliothèque de types.
-
liste de propriétés
-
(Syntaxe 1) Liste facultative des propriétés prises en charge par l’objet, déclarées sous la forme de variables. Il s’agit de la forme abrégée de la déclaration des fonctions de propriété dans la liste des méthodes. Pour plus d’informations, consultez la section commentaires.
-
List, méthode
-
(Syntaxe 1) Liste comprenant un prototype de fonction pour chaque méthode et propriété de dispinterface. Un nombre quelconque de définitions de fonction peuvent apparaître dans methlist. Une fonction dans methlist se présente sous la forme suivante :
[attributs ] ReturnType methname type paramName (params);
Les attributs suivants sont acceptés sur une méthode dans une dispinterface: [ helpString ], [ HelpContext ], [ propget ] , [ propput ] , [ PROPPUTREF ] , [ String ] et [ vararg ] . Si [ vararg ] est spécifié, le dernier paramètre doit être un tableau sécurisé de type Variant .
La liste de paramètres est une liste délimitée par des virgules, dont chaque élément se présente sous la forme suivante :
[attributs]
Le type peut être n’importe quel type déclaré ou intégré, ou un pointeur vers n’importe quel type. Les attributs sur les paramètres sont les suivants :
[in ] , [ out ] , [ facultatif ] , [ String ]
-
nom de l’interface
-
(Syntaxe 2) Nom de l’interface à déclarer en tant qu’interface IDispatch.
Notes
Le compilateur MIDL accepte l’ordonnancement des paramètres suivant (de gauche à droite) :
- Paramètres obligatoires (paramètres qui n’ont pas les [ ] attributs DefaultValue ou [ facultatifs ] )
- paramètres facultatifs avec ou sans [ l' ] attribut DefaultValue,
- paramètres avec l' [ ] attribut facultatif et sans l' [ ] attribut DefaultValue,
- [paramètre LCID ] , le cas échéant,
- [retVal ] paramètre
Les fonctions de méthode sont spécifiées exactement comme décrit dans la page de référence du module , sauf que l’attribut d' [ entrée ] n’est pas autorisé. Notez que STDOLE32. TLB (STDOLE. TLB sur les systèmes 16 bits) doit être importé, car une dispinterface hérite de IDispatch.
Vous pouvez déclarer des propriétés dans les listes de propriétés ou de méthodes. La déclaration de propriétés dans la liste Propriétés n’indique pas le type d’accès pris en charge par la propriété (c’est-à-dire, l’extraction, la mise en place ou la PutRef). Spécifiez l' [ ] attribut ReadOnly pour les propriétés qui ne prennent pas en charge put ou PutRef. Si vous déclarez les fonctions de propriété dans la liste des méthodes, les fonctions d’une propriété ont toutes le même identificateur.
À l’aide de la première syntaxe, les balises Properties : et Methods sont requises. L' [ attribut ID ] est également requis sur chaque membre. Par exemple :
properties:
[id(0)] int Value; // Default property.
methods:
[id(1)] HRESULT Show();
Contrairement aux membres d’interface, les membres dispinterface ne peuvent pas utiliser l’attribut retVal pour retourner une valeur en plus d’un code d’erreur HRESULT. L' [ ] attribut LCID est également non valide pour les dispinterfaces, car IDispatch :: Invoke passe un LCID. Toutefois, il est possible de redéclarer une interface qui utilise ces attributs.
À l’aide de la deuxième syntaxe, les interfaces qui prennent en charge IDispatch et sont déclarées précédemment dans un script ODL peuvent être redéclarées comme des interfaces IDispatch comme suit :
dispinterface helloPro
{
interface hello;
};
L’exemple précédent déclare tous les membres de Hello et tous les membres que Hello hérite de en prenant en charge IDispatch. Dans ce cas, si Hello a été déclaré précédemment avec des [ ] membres LCID et [ retval ] qui retournaient HRESULT, mktyplib supprimerait chaque [ ] paramètre LCID et le type de retour HRESULT, et marquera à la place le type de retour comme celui du [ ] paramètre retval.
Notes
L’outil Mktyplib.exe est obsolète. Utilisez plutôt le compilateur MIDL.
Les propriétés et les méthodes d’une dispinterface ne font pas partie du VTBL de la dispinterface. Par conséquent, CreateStdDispatch et DispInvoke ne peuvent pas être utilisés pour implémenter IDispatch :: Invoke. La dispinterface est utilisée lorsqu’une application doit exposer des fonctions non VTBL existantes par le biais de l’automatisation. Ces applications peuvent implémenter IDispatch :: Invoke en examinant le paramètre dispidMember et en appelant directement la fonction correspondante.
Exemples
[
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);
}