Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

Уроки по Visual C++.NET. Рассылки сайта progs.biz
Выпуск № 90
 
Начало > Visual C++ 6 > ATL > Урок 18

Том Миллер. DirectX 9 с управляемым кодом. Программирование игр и графики.
Том Миллер. DirectX 9 с управляемым кодом. Программирование игр и графики
Заказать на Озоне

Подробнее


Полные версии уроков (с картинками): урок 18.

Visual C++. ATL
Урок 18. Метод QueryInterface в действии

Метод QueryInterface позволяет выяснить, поддерживает ли наш объект некоторый COM-интерфейс. Этот метод должен быть в любом COM-классе, так как все такие классы есть потомки интерфейса IUnknown (который содержит этот интерфейс).

Фактически этот метод позволяет выяснить, что в реальности записано в нашем объекте.

Рассмотрим это все на примере.

Создадим два ATL-компонента в одной dll - Obj1 и Obj2 (их классы будут CObj1 и CObj2 соответственно). Добавим во второй компонент два метода IsObject1 и IsObject2. Они предназначены для выяснения, не является ли наш компонент Obj1 или Obj2 - т. е. если ответ положительный (компонент является соответствующим объектом), то метод возвратит 1, в протифном случае метод возвратит 0.

Вот их код:

STDMETHODIMP CObj2::IsObject1(short *res)
{
    // TODO: Add your implementation code here
    IObj1 * p;
    if(SUCCEEDED(QueryInterface(IID_IObj1, (void**)&p)))
    {
        *res = 1;
    }
    else
    {
        *res = 0;
    }
    return S_OK;
}

STDMETHODIMP CObj2::IsObject2(short *res)
{
    // TODO: Add your implementation code here
    IObj2 * p;
    if(SUCCEEDED(QueryInterface(IID_IObj2, (void**)&p)))
    {
        *res = 1;
    }
    else
    {
        *res = 0;
    }
    return S_OK;
}

Как вы видите, после вызова QueryInterface во втором параметре либо что-то оказывается (в этом случае объект поддерживает интерфейс, определяемый первым параметром), либо ничего не оказывается (в этом случае объект не поддерживает интерфейс, определяемый первым параметром).

В этом коде первым параметром метода QueryInterface мы берем идентификаторы для наших двух интерфейсов (IID_IObj1 и IID_IObj2). Их можно посмотреть, например, в объявлении наших классов:

class ATL_NO_VTABLE CObj1 : 
    ...
    public IDispatchImpl<IObj1, &IID_IObj1, &LIBID_QINTERFLib>
    ...

Соответсвующий код в VB может быть, например, таким (тут q2 - это экземпляр нашего второго компонента):

Private Sub Command1_Click()
    Dim k As Integer
    k = q2.IsObject1()
    MsgBox k
    k = q2.IsObject2()
    MsgBox k
End Sub

Этот код, разумеется, сначала покажет два messagbox'а: первый с 0, второй - с 1.

Рассылки сайта progs.biz
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2005 сайт progs.biz
© 2002-2005 Алексеев Игорь

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.lessonsfromai
Отписаться

В избранное