dispinterface - атрибут
Оператор dispinterface определяет набор свойств и методов, для которых можно вызвать IDispatch::Invoke. Dispinterface можно определить путем явного перечисления набора поддерживаемых методов и свойств (синтаксис 1) или путем перечисления одного интерфейса (синтаксис 2).
[
[attributes]
]
dispinterface dispinterface-name
{
properties:
property-list
methods:
method-list
};
[
[attributes]
]
dispinterface dispinterface-name
{
interface interface-name
};
-
attributes
-
Указывает атрибуты, которые применяются ко всему dispinterface. Принимаются следующие атрибуты: [helpstring], [helpcontext], [helpfile], [hidden], [nonextensible], [oleautomation], [restricted], [uuid] и [version].
-
dispinterface-name
-
Имя, под которым dispinterface известно в библиотеке типов. Это имя должно быть уникальным в пределах библиотеки типов.
-
список свойств
-
(Синтаксис 1) Необязательный список свойств, поддерживаемых объектом , объявленный в виде переменных. Это краткая форма объявления функций свойств в списке методов. Дополнительные сведения см. в разделе примечаний.
-
method-list
-
(Синтаксис 1) Список, содержащий прототип функции для каждого метода и свойства в dispinterface. В списке метаданных может отображаться любое количество определений функций. Функция в списке methlist имеет следующую форму:
[атрибуты]returntype methname type paramname(params);
В методе dispinterface принимаются следующие атрибуты: [helpstring], [helpcontext], [propget], [propput], [propputref], [string], и [vararg]. Если указан параметр [vararg] , последний параметр должен быть безопасным массивом типа VARIANT .
Список параметров представляет собой список с разделителями-запятыми, каждый элемент которого имеет следующую форму:
[атрибуты]
Тип может быть любым объявленным или встроенным типом, а также указателем на любой тип. Атрибуты параметров:
-
interface-name
-
(Синтаксис 2) Имя интерфейса, объявляемого как интерфейс IDispatch.
Компилятор MIDL принимает следующий порядок параметров (слева направо):
- Обязательные параметры (параметры, которые не имеют атрибутов [defaultvalue] или [optional]),
- необязательные параметры с атрибутом [defaultvalue] или без нее;
- параметры с атрибутом [необязательный] и без атрибута [defaultvalue],
- [ lcid] параметр, если таковой есть,
- [ retval] параметр
Функции метода указываются точно так, как описано на странице справочника по модулю , за исключением того, что атрибут [ entry] не разрешен. Обратите внимание, что STDOLE32. TLB (STDOLE. TLB в 16-разрядных системах) необходимо импортировать, так как dispinterface наследуется от IDispatch.
Свойства можно объявлять в списках свойств или методов. Объявление свойств в списке свойств не указывает тип доступа, поддерживаемый свойством (то есть get, put или putref). Укажите атрибут [ readonly] для свойств, которые не поддерживают put или putref. При объявлении функций свойств в списке методов функции для одного свойства имеют одинаковый идентификатор.
При использовании первого синтаксиса требуются теги properties: и methods: . Атрибут [ id] также является обязательным для каждого элемента. Пример:
properties:
[id(0)] int Value; // Default property.
methods:
[id(1)] HRESULT Show();
В отличие от членов интерфейса, члены dispinterface не могут использовать атрибут retval для возврата значения в дополнение к коду ошибки HRESULT. Атрибут [ lcid] также недопустим для dispinterfaces, так как IDispatch::Invoke передает LCID. Однако можно повторно объявить интерфейс, использующий эти атрибуты.
Используя второй синтаксис, интерфейсы, которые поддерживают IDispatch и объявлены ранее в скрипте ODL, можно повторно объявить как интерфейсы IDispatch следующим образом:
dispinterface helloPro
{
interface hello;
};
В предыдущем примере объявляют все члены hello и все члены, наследуемые hello, как поддерживающие IDispatch. В этом случае, если hello были объявлены ранее с элементами [lcid] и [retval], возвращающими HRESULT, MkTypLib удалит каждый параметр [lcid] и тип возвращаемого значения HRESULT, а вместо этого помечает тип возвращаемого значения как тип параметра [retval].
Примечание
Средство Mktyplib.exe устарело. Вместо этого используйте компилятор MIDL.
Свойства и методы dispinterface не являются частью параметров ПАРАМЕТРОВL dispinterface. Следовательно, CreateStdDispatch и DispInvoke нельзя использовать для реализации IDispatch::Invoke. Dispinterface используется, когда приложению необходимо предоставить существующие функции, не относящиеся к нулю, через автоматизацию. Эти приложения могут реализовать IDispatch::Invoke путем проверки параметра dispidMember и непосредственного вызова соответствующей функции.
[
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);
}