Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

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.



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS