object - атрибут
Атрибут интерфейса [object] идентифицирует COM-интерфейс. (Список атрибутов интерфейса, не включающий атрибут [object] , указывает на интерфейс RPC DCE.)
[
object,
uuid(string-uuid)
[ , interface-attribute-list]
]
interface interface-name : base-interface
{
...
}
-
string-uuid
-
Строка UUID, созданная служебной программой Uuidgen. Строку UUID можно заключить в кавычки.
-
interface-attribute-list
-
Другие атрибуты, которые применяются к интерфейсу в целом.
-
имя интерфейса
-
Имя интерфейса.
-
базовый интерфейс
-
COM-интерфейс, от которого наследуется этот интерфейс. Базовым интерфейсом должен быть IUnknown, IDispatch или другой COM-интерфейс, который прямо или косвенно является производным от IUnknown или IDispatch.
Список атрибутов интерфейса для COM-интерфейса должен содержать атрибут [uuid] , но он не может включать атрибут [version] .
По умолчанию при компиляции COM-интерфейса с помощью компилятора MIDL создаются файлы, необходимые для создания библиотеки DLL прокси-сервера. Эта библиотека DLL содержит код для поддержки использования пользовательского COM-интерфейса клиентскими приложениями и серверами объектов. Однако если в списке атрибутов интерфейса для COM-интерфейса указан атрибут [local] , компилятор MIDL создает только файл заголовка интерфейса.
Компилятор MIDL автоматически создает тип данных интерфейса для COM-интерфейса. В качестве альтернативы можно использовать typedefс интерфейсом ключевое слово для явного определения типа данных интерфейса. Затем спецификация интерфейса может использовать тип данных интерфейса в параметрах функции и возвращаемых значениях, элементах структуры и объединения и других объявлениях типов. В следующем примере показано использование автоматически создаваемого типа данных IStream :
[
object,
uuid (ABCDEFOO-1234-1234-5678-ABCDEF123456)
]
interface IStream : IUnknown
{
typedef IStream * LPSTREAM;
// Other interface definition statements.
}
В COM-интерфейсе все функции-члены интерфейса считаются виртуальными функциями. Виртуальная функция имеет неявный этот указатель в качестве первого параметра. Таблица виртуальных функций содержит запись для каждой функции-члена интерфейса.
Функции-члены интерфейса объектов, не являющиеся [локальными] , должны иметь возвращаемое значение HRESULT или SCODE. (Обратите внимание, что в более ранних версиях MIDL функции-члены возвращали void. Однако, начиная с MIDL версии 3.0, при возврате void возникает ошибка компилятора.) Наличие возвращаемого значения HRESULT или SCODE означает, что если исключение создается во время удаленного вызова, созданные прокси-серверы перехватят исключение и возвращают код исключения в возвращаемом значении. Если приложение может игнорировать ошибки, возникающие во время удаленного вызова процедуры, можно указать HRESULT в качестве возвращаемого типа, не проверяя возвращаемое значение после вызова.
Если вы перекомпилируете старое приложение, изменение типов возвращаемых данных может привести к проблемам обратной совместимости, когда сервер отправляет новый результат клиенту. В качестве альтернативы изменению возвращаемого типа можно пометить функцию, возвращающую void , атрибутом [call_as] , что делает ее локальной. Затем определите связанную удаленную функцию с теми же параметрами, но с возвращаемым типом HRESULT. При необходимости локальная функция может вызвать исключение на основе этого значения HRESULT.
Атрибут [object] недоступен при компиляции с помощью параметра / osf компилятора 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.
}