C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь


http://rodzem.ru/ продажа земельных участков днп в московской области.

 Урок 18. Метод QueryInterface в действии / Библиотека ATL / Visual C++

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.