Есть ли смысл маркировать интерфейс, полученный из IUnknown, как двойной в IDL?

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

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

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

2 ответа

Решение

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

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

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

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

Может быть, что [dual] атрибут неявно добавляет IDispatch к интерфейсу.

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

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

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

Другие вопросы по тегам