Есть ли смысл маркировать интерфейс, полученный из IUnknown, как двойной в IDL? - PullRequest
5 голосов
/ 28 октября 2009

Просматривая наш код, я нашел любопытное определение в одном из файлов .idl:

[
    object,
    uuid(uuidhere),
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface IOurInterface : IUnknown {
    //methods here
};

Как интерфейс, полученный непосредственно из IUnknown, может быть двойным? Что-нибудь сломается, если я удалю атрибут dual?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

В этот ответ на другой вопрос о маршалинге user voyce указывает на эту статью , в которой в основном говорится следующее:

Если какой-либо интерфейс (производный от IDispatch или нет) помечен либо dual, либо oleautomation (или и тем, и другим), он обрабатывается специально, когда вызывается RegisterTypeLib() (что обычно выполняется DllRegisterServer). Для каждого такого интерфейса создается ключ HKCR \ Interface {InterfaceId}, в котором класс {00020424-0000-0000-C0000-000000000046} упоминается как прокси / заглушка. Этот идентификатор класса соответствует маршаллеру typelib, также известному как маршаллер oleautomation.

1 голос
/ 02 ноября 2009

Я не вижу причины, по которой это сработает, учитывая документы здесь: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

Интерфейсы, идентифицированные двойным атрибут должен быть совместим с Автоматизация и быть производным от IDispatch. Этот атрибут не разрешено на интерфейсах.

Возможно, атрибут [dual] неявно добавляет IDispatch к интерфейсу.

Что вы можете сделать, это проверить код, реализующий интерфейс (при условии, что это ATL), если он происходит от IDispatchImpl. Если это так, он фактически отвечает на QI для IDispatch и может использоваться как таковой.

Другой альтернативой является создание объекта, реализующего IOurInterface, и выполнение QI для IDispatch - если это удастся, вы, вероятно, не сможете удалить его.

На самом деле, если подумать, может быть, [dual] не требует технически от вас наследовать от IDispatch, пока вы реализуете и свой пользовательский интерфейс, и IDispatch?

...