Интерфейсы с одинаковыми методами в COM
От: Kolbas  
Дата: 07.11.05 15:00
Оценка:
Как определить с какого интерфейса вызван метод класса, если он имеет несколько интерфейсов, которые содержат одинаковые сигнатуры методов? Есть ли решение лучше, чем делать обертку для
интерфейса с переопределением методов (или это вовсе не решение)


interface IFace1 : public IUnknown 
{
  long Method()=0;
};

interface IFace2 : public IUnknown 
{
  long Method()=0;
};
 
class ATL_NO_VTABLE TFACEImpl :
  public CComObjectRootEx<CComMultiThreadModel>,
  public CComCoClass<TFACEImpl, &CLSID_FACE>,
  public IBase,
  DUALINTERFACE_IMPL(Base, IFace1),
  DUALINTERFACE_IMPL(Base, IFace2)

{
public:
...

BEGIN_COM_MAP(TR2MImpl)
  COM_INTERFACE_ENTRY(IFace1)
  DUALINTERFACE_ENTRY(IFace2)
END_COM_MAP()

  STDMETHOD Method() // Реализация общая для обоих интерфейсов, а хотелось бы разделить 
  {
  }
};
Re: Интерфейсы с одинаковыми методами в COM
От: ak_miass Россия  
Дата: 08.11.05 05:17
Оценка:
Здравствуйте, Kolbas, Вы писали:

Где то видел решение. Подробности не помню, но суть в том, что
нужно сначала сделать по одному классу-потомку от каждого из интерфейсов и реализовать
одинаковые методы в них, а класс COM-объекта наследовать уже от этих классов, а не самих интерфейсов.
Возможно при этом придётся ещё поменять какие либо макросы в объявлении класса...
Re[2]: Интерфейсы с одинаковыми методами в COM
От: Kolbas  
Дата: 08.11.05 05:31
Оценка:
Здравствуйте, ak_miass, Вы писали:

_>Здравствуйте, Kolbas, Вы писали:


_>Где то видел решение. Подробности не помню, но суть в том, что

_>нужно сначала сделать по одному классу-потомку от каждого из интерфейсов и реализовать
_>одинаковые методы в них, а класс COM-объекта наследовать уже от этих классов, а не самих интерфейсов.
_>Возможно при этом придётся ещё поменять какие либо макросы в объявлении класса...

Спасибо, всётаки примерно так и сделал:

#define IID_ReFace1 IDD_IFace1;

interface IReFace1 : public IFace1
{
  long Method(){return ReFace1Method()};
  virtual ReFace1Method()=0;
}

interface IReFace2 : public IFace1
{
  long Method(){return ReFace2Method()};
  virtual ReFace2Method()=0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.