Заинтересовался COM .
От: Andir Россия
Дата: 28.07.02 06:20
Оценка:
Привет Всем !

Вот и пришло собсно время для сабжа, сижу, изучаю ... читаю "Введение в COM"
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.
и натыкаюсь на такой пример реализации QueryInterface -> в студию:
HRESULT Math::QueryInterface( REFIID riid, void** ppv )
{
   switch( riid )
   {
   case IID_IUnknown:
   case IID_IMath;
      *ppv = this;
      // Поскольку мы возврацаем новый указатель на
      // интерфейс, необходимо вызвать метод AddRef
      AddRef();
      return ( S_OK ) ;

   default:
      return ( E_NOINTERFACE );
   }
}

Что меня собсно удивило, так это switch — попробовал на VC++ 7.0 неработает, говорит что низя так (оно и понятно структура всё таки). И Дык собсно вопросец: Чем руководствовался автор при написании такого кода ? (кстати проверил в примере реализация самая обычная через if ... else)

C Уважением, Andir!
Re: Заинтересовался COM .
От: Рома Россия  
Дата: 28.07.02 08:02
Оценка:
Здравствуйте Andir, Вы писали:

A>Привет Всем !


A>Вот и пришло собсно время для сабжа, сижу, изучаю ... читаю "Введение в COM"
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.
и натыкаюсь на такой пример реализации QueryInterface -> в студию:

A>
A>HRESULT Math::QueryInterface( REFIID riid, void** ppv )
A>{
A>   switch( riid )
A>   {
A>   case IID_IUnknown:
A>   case IID_IMath;
A>      *ppv = this;
A>      // Поскольку мы возврацаем новый указатель на
A>      // интерфейс, необходимо вызвать метод AddRef
A>      AddRef();
A>      return ( S_OK ) ;

A>   default:
A>      return ( E_NOINTERFACE );
A>   }
A>}
A>

A>Что меня собсно удивило, так это switch — попробовал на VC++ 7.0 неработает, говорит что низя так (оно и понятно структура всё таки).
Надо заменить

case IID_IMath;

на
case IID_IMath:

Это обычный синтаксис, для разных 2-х значений переменной в switch выполняются одинаковые действия.
Re[2]: Заинтересовался COM .
От: Igor Soukhov  
Дата: 28.07.02 09:51
Оценка: 11 (2)
Здравствуйте Рома, Вы писали:

Р>
Р>case IID_IMath;
Р>

Р>на
Р>
Р>case IID_IMath:
Р>

Р>Это обычный синтаксис, для разных 2-х значений переменной в switch выполняются одинаковые действия.

Дело в другом, точка с запятой в case IID_IMath это наверняка описка. Andir прав, — в С++ switch может быть
использован только с интегральными типами:


switch ( expression )
case constant-expression : statement
[default : statement]
The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type. Integral promotion is performed as described in Integral Promotions.


наиболее вероятно автор книги привел просто псевдокод, показывающий
реализацию QI.
* thriving in a production environment *
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.