2.2.49 IDL Syntax Extensions

Automation provides a number of IDL extensions that support a seamless integration of automation servers with generic automation clients, scripting languages, and various development environments.<28> A client that uses automation type descriptions to examine the functionality provided by an automation type library or an automation server is an automation type browser.

This section specifies the automation types and the IDL attributes and statements that have an impact on the wire communication between an automation client and server. It also specifies the attributes and statements that allow a client to discover rich type information regarding the automation servers that it is calling.

The areas covered are:

  • COM server categories and behaviors that can be described by the IDL extensions: aggregatable servers, connectable servers, and bindable servers.

  • Automation-compatible types, which are relevant to marshaling the arguments as part of the call to IDispatch::Invoke (see section 3.1.4.4).

  • Automation library scope, which provides context for marshaling UDTs (see sections 2.2.28 and 2.2.31).

  • Automation DISPIDs, which provide the information needed for performing an automation call through IDispatch::Invoke (see section 3.1.4.4).

  • Automation attributes and statements that specify a rich set of type information regarding an automation server (see sections 3.5 through 3.14).

The extensions to the IDL that are specified by the OLE Automation Protocol are derived from the now-obsolete Object Definition Language (ODL). The extensions take the following forms.

  • A set of attributes that specify additional semantic meaning for the language element they decorate: version, lcid, oleautomation, dual, id, propget, propput, propputref, readonly, defaultvalue, optional, vararg, and retval.

  • A set of statements that allow for additional information to be specified, or for an alternative way to define language elements. The statements are introduced by the following keywords: library, dispinterface, methods, and properties.

  • A set of attributes that specify a rich group of properties of interest to the automation client: control, source, default, defaultvtable, bindable, defaultbind, immediatebind, displaybind, requestedit, public, uidefault, restricted, hidden, nonbrowsable, helpcontext, helpfile, helpstring, helpstringcontext, helpstringdll, appobject, predeclid, aggregatable, defaultcollelem, licensed, proxy, noncreatable, nonextensible, custom, and replaceable.

  • A statement that allows specifying an automation server coclass.

Extensions to the IDL syntax that support the OLE Automation Protocol are specified by using the Augmented Backus-Naur Form (ABNF) notation, as specified in [RFC4234] section 2.2.

The DCE 1.1: Remote Procedure Call, as specified in [C706], specifies the syntax for IDL by using an extended BNF notation. The following table specifies the DCE 1.1: Remote Procedure Call (as specified in [C706]), the production names referenced later, and the corresponding ABNF name as it will be used in this specification.

DCE 1.1: Remote Procedure Call production name

Equivalent ABNF production name

<Uuid_rep>

uuid-rep

<integer_const_exp>

integer-const-exp

<param_attribute>

param-attribute

<const_exp>

const-exp

<type_attribute>

type-attribute

<param_attribute>

param-attribute

<operation_attributes>

operation-attributes

<op_declarator>

op-declarator

<interface_attribute>

interface-attribute

<interface_attributes>

interface-attributes

<interface>

interface

<import>

import

<export>

export

<string>

string

<param_declarators>

param-declarators

 In addition, the productions use LWSP as the linear whitespace production rpcidl-defined for any production defined in [C706] section 4, and "kw-KEYWORD" as the production for the case-sensitive keyword KEYWORD:

 kw-aggregatable = %d97.103.103.114.101.103.97.116.97.98.108.101
 kw-appobject = %d97.112.112.111.98.106.101.99.116
 kw-bindable = %d98.105.110.100.97.98.108.101
 kw-boolean = %d98.111.111.108.101.97.110
 kw-BSTR = %d66.83.84.82
 kw-cdecl = %d99.100.101.99.108
 kw-char = %d99.104.97.114
 kw-coclass = %d99.111.99.108.97.115.115
 kw-const = %d99.111.110.115.116
 kw-control = %d99.111.110.116.114.111.108
 kw-CURRENCY = %d67.85.82.82.69.78.67.89
 kw-custom = %d99.117.115.116.111.109
 kw-DATE = %d68.65.84.69
 kw-Decimal = %d68.101.99.105.109.97.108
 kw-default = %d100.101.102.97.117.108.116
 kw-defaultbind = %d100.101.102.97.117.108.116.98.105.110.100
 kw-defaultcollelem = 
     %d100.101.102.97.117.108.116.99.111.108.108.101.108.101.109
 kw-defaultvalue = 
     %d100.101.102.97.117.108.116.118.97.108.117.101
 kw-defaultvtable = 
     %d100.101.102.97.117.108.116.118.116.97.98.108.101
 kw-dispinterface = 
     %d100.105.115.112.105.110.116.101.114.102.97.99.101
 kw-displaybind = 
     %d100.105.115.112.108.97.121.98.105.110.100
 kw-dllname = %d100.108.108.110.97.109.101
 kw-double = %d100.111.117.98.108.101
 kw-dual = %d100.117.97.108
 kw-entry = %d101.110.116.114.121
 kw-float = %d102.108.111.97.116
 kw-helpcontext = %d104.101.108.112.99.111.110.116.101.120.116
 kw-helpfile = %d104.101.108.112.102.105.108.101
 kw-helpstring = %d104.101.108.112.115.116.114.105.110.103
 kw-helpstringcontext = 
    %d104.101.108.112.115.116.114.105.110.103.99.111.110.116.101.120.116
 kw-helpstringdll = 
     %d104.101.108.112.115.116.114.105.110.103.100.108.108
 kw-hidden = %d104.105.100.100.101.110
 kw-id = %d105.100
 kw-immediatebind = 
    %d105.109.109.101.100.105.97.116.101.98.105.110.100
 kw-importlib = %d105.109.112.111.114.116.108.105.98
 kw-int = %d105.110.116
 kw-interface = %d105.110.116.101.114.102.97.99.101
 kw-lcid = %d108.99.105.100
 kw-library = %d108.105.98.114.97.114.121
 kw-licensed = %d108.105.99.101.110.115.101.100
 kw-long = %d108.111.110.103
 kw-methods = %d109.101.116.104.111.100.115
 kw-module = %d109.111.100.117.108.101
 kw-nonbrowsable = %d110.111.110.98.114.111.119.115.97.98.108.101
 kw-noncreatable = %d110.111.110.99.114.101.97.116.97.98.108.101
 kw-nonextensible = 
     %d110.111.110.101.120.116.101.110.115.105.98.108.101
 kw-oleautomation = 
     %d111.108.101.97.117.116.111.109.97.116.105.111.110
 kw-optional = %d111.112.116.105.111.110.97.108
 kw-pascal = %d112.97.115.99.97.108
 kw-predeclid = %d112.114.101.100.101.99.108.105.100
 kw-properties = %d112.114.111.112.101.114.116.105.101.115
 kw-propget = %d112.114.111.112.103.101.116
 kw-propput = %d112.114.111.112.112.117.116
 kw-propputref = %d112.114.111.112.112.117.116.114.101.102
 kw-proxy = %d112.114.111.120.121
 kw-public = %d112.117.98.108.105.99
 kw-readonly = %d114.101.97.100.111.110.108.121
 kw-replaceable = %d114.101.112.108.97.99.101.97.98.108.101
 kw-requestedit = %d114.101.113.117.101.115.116.101.100.105.116
 kw-restricted = %d114.101.115.116.114.105.99.116.101.100
 kw-retval = %d114.101.116.118.97.108
 kw-SAFEARRAY = %d83.65.70.69.65.82.82.65.89
 kw-SCODE = %d83.67.79.68.69
 kw-short = %d115.104.111.114.116
 kw-source = %d115.111.117.114.99.101
 kw-static = %d115.116.97.116.105.99
 kw-stdcall = %d115.116.100.99.97.108.108
 kw-uidefault = %d117.105.100.101.102.97.117.108.116
 kw-unsigned = %d117.110.115.105.103.110.101.100
 kw-uuid = %d117.117.105.100
 kw-usesgetlasterror = 
   %d117.115.101.115.103.101.116.108.97.115.116.101.114.114.111.114
 kw-vararg = %d118.97.114.97.114.103
 kw-version = %d118.101.114.115.105.111.110
  

For the full ABNF specification of the extensions provided in this section, see Appendix C.