2009-10-28 7 views
5

пересматриваем код, который я нашел любопытное определение в одном из .IDL файлов:Любое чувство в маркировке IUnknown-производного интерфейса как двойного в IDL?

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

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

ответ

3

В this answer на другой вопрос о сортировочной user voyce указывает на this article, что в основном говорится следующее:

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

+0

Ах да, это так. Поскольку у вас уже была «oleautomation», я подумал, что это было неявно ... Я не знал точных особенностей, хотя, спасибо за последующие действия! –

+0

И я все же думаю, что вы должны убедиться, что объект не отвечает на QI для 'IDispatch', прежде чем удалить его. –

+0

Да, я полностью согласен с ответом QI с IDispatch. – sharptooth

1

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^