Какой-либо смысл в маркировке IUnknown-полученного интерфейса как двойной в IDL?

Просто определите структуру/класс.

[Serializable]
public struct KeyValuePair<K,V>
{
  public K Key {get;set;}
  public V Value {get;set;}
}
5
задан sharptooth 28 October 2009 в 13:37
поделиться

2 ответа

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

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

3
ответ дан 15 December 2019 в 01:05
поделиться

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

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

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

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

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

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

1
ответ дан 15 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: