LoveRead.info » Книги » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский

Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский

Книгу Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

138 0 18:00, 07-12-2022
Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский
07 декабрь 2022

Книга Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский читать онлайн бесплатно без регистрации

Большой и увлекательный, научно-прикладной и образовательный, но некоммерческий интернет-журнал, созданный группой энтузиастов. Интернет-журнал содержит материалы, найденные в Интернет или написанные для Интернет. Основная тематика статей — то, что можно сделать самому, от садовых поделок до сверхпроводников, но есть и просто полезные материалы.

    1 ... 196 197 198 199 200 201 202 203 204 ... 361
    Перейти на страницу:
    {    unsigned long Data1;

                     unsigned short Data2;

                     unsigned short Data3;

                     unsigned char Data4[8];

                } GUID

    Эту структуру удобно задавать с помощью следующего макроса

    #define DEFINE_GUID(name,

          1, w1, w2, b1, Ь2, Ь3, Ь4, Ь5, Ь6, b7, b8)

          EXTERN_C const GUID name

          = { 1, w1, w2, { b1, Ь2, Ь3, Ь4, Ь5, Ь6, b7 b8 } }

    Ниже представлен файл iid.h в котором определены GUID всех трех ранее определенных интерфейсов (позже в этот файл будут добавлены и GUID классов, реализующих указанные интерфейсы). Для получения GUID можно использовать утилиту guidgen.ехе из Visual Studio. Эта утилита позволяет получить определение нового GUID в виде макроса DEFINE GUID, который можно скопировать и вставить в файл определений GUID. В закоментированных строках этого файла содержатся значения GUID в виде, удобном для просмотра человеком. Имя идентификатора интерфейса стандартно формируется следующим образом — префикс IID_, за которым следует имя интерфейса. Например, IID_IPub.

    // iid.h — GUID для интерфейсов

    // {9A5DE 9А0-7225-11d5-9 8С7-000001223694}

    DEFINE_GUID(IID_IPub,

          0x9a5de9a0, 0x7225, 0x11d5,

          0x98, 0xc7, 0x0, 0x0, 0x1, 0x22, 0x36, 0x94);

    // {9A5DE9A1-7225-11d5-98C7-000001223694 }

    DEFINE_GUID(IID_IBook,

          0x9a5de9a1, 0x7225, 0x11d5,

          0x98, 0xc7, 0x0, 0x0, 0x1, 0x22, 0x36, 0x94);

    // {9A5DE 9A2-7225-11d5-98C7-000001223694}

    DEFINE_GUID(IID_IJournal,

          0x9a5de9a2, 0x7225, 0xlld5,

          0x98, 0xc7, 0x0, 0x0, 0x1, 0x22, 0x36, 0x94);

    Реализация интерфейсов — коклассы

    Теперь пора перейти к реализации наших интерфейсов. В соответствии с базовой архитектурой СОМ, интерфейсы реализуются в классах, каждый из которых может реализовать несколько интерфейсов. Далее определяются и реализуются два класса — CoBоoк и CоJournal, реализующие соответственно интерфейсы IBook и IJournal. Все названия классов в СОМ удобно начинать с префикса со, подчеркивая их принадлежность данной модели. Часто классы, определенные в СОМ, называют коклассами.

    Рассмотрим вначале файл CoBоок. h

    //////////////////////////////////////////////////

    // СоВоок. h: заголовочный файл для класс СоВоок //

    //////////////////////////////////////////////////

    #ifndef _СоВоок_

    #define _СоВоок_

    #include "IBook.h" // определение интерфейса IBook

    #include "iid.h" // GUID интерфейса IBook

    class CoBook:

               public IBook

    {

    public:

               CoBook(); // конструктор

               virtual ~CoBook(); // деструктор

               // IUnknown

               STDMETHODIMP Querylnterface(REFIID riid, void** pIFace);

               STDMETHODIMP_(ULONG) AddRef();

                STDMETHODIMP (ULONG) Release();

               // IPub

               STDMETHODIMP SetTitle(BSTR bstrTitle);

               STDMETHODIMP SetYear(int nYear);

               STDMETHODIMP Getlnfo(BSTR* pbstrlnfo);

               // IBook

               STDMETHODIMP SetAuthor(BSTR bstrAuthor);

    private:

               ULONG m_refCount; // Счетчик ссылок

               BSTR m_bstrTitle; // Название публикации

               BSTR m_bstrAuthor; // Автор публикации

               int m_nYear; // Год публикации

    };

    #endif

    Здесь определяется класс CоBоок, порожденный от интерфейса IBook. Так как интерфейс IBook был сам порожден от интерфейса IPub, а последний — от стандартного интерфейса IUnknown, то класс CоBоок должен реализовать чисто виртуальные методы всех этих интерфейсов.

    Здесь при определении методов используются следующие макросы

    #define STDMETHODIMP HRESULT stdcall

    #define STDMETHODIMP (type) type stdcall

    теперь надо поговорить об основном стандартном интерфейсе модели COM — IUknown.

    Как уже не раз говорилось, любой интерфейс СОМ должен порождаться от IUnknown или от другого интерфейса. Следовательно, все интерфейсы СОМ имеют общего предка — интерфейс IUnknown. Этот интерфейс определяется в <unknwn.h> и его GUID равен

    00000000-0000-0000-С000-000000000046.

    Интерфейс IUnknown определяет 3 метода, и все эти методы должны быть реализованы в каждом коклассе

    • Querylnterfасе()

    Данный метод обеспечивает клиента информацией о том, реализован ли интересующий его интерфейс в данном коклассе. В случае реализованное™ запрашиваемого интерфейса клиент получает ссылку на интерфейс. Этот подход обеспечивает необходимую гибкость, позволяя работать с одним компонентам различным клиентам, имеющим различный уровень знаний о доступных интерфейсах.

    Семантика этого метода следующая. Имея указатель некоторого интерфейса pIFacel некоторого объекта и передавая в Queryinterfасе ссылку на идентификатор нового интерфейса IID_IFace2 можно получить указатель на новый интерфейс piFace2, если он реализован в данном объекте. В случае успеха возвращаемое значение S_OK, а в случае неудачи — E_NOINTERFACE

    hr = pIFacel->QueryInterfасе(IID_IFace2, (void**)&pIFace2);

    При реализации этого метода нужно обеспечить выполнение следующего принципа — клиент, имеющий ссылку на некоторый интерфейс объекта, должен иметь возможность перехода к любому другому интерфейсу этого объекта.

    Эта реализация может обеспечиваться за счет использования таблиц виртуальных функций, которыми и являются все методы всех интерфейсов (при реализации кокласса на C++). Заметим, что если кокласс порожден от независимых друг от друга интерфейсов (т. е. один интерфейс не является потомком другого), то компилятор C++ создает виртуальных таблиц — по одной на каждый интерфейс. В каждой таблице хранятся указатели на все методы всех интерфейсов, от которых порожден данный интерфейс. Следовательно, начинается каждая таблица виртуальных функций с указателей на методы интерфейса iunknown. Обратите внимание, что реализовать каждый метод нужно только один раз, не зависимо от числа его появлений в таблицах виртуальных функций данного класса.

    • AddRef()

    В СОМ управление временем жизни объекта выполняется при использовании функций AddRef() и Reiease(). Taк как объект может использоваться многими клиентами одновременно, ни один из клиентов не имеет права удалить объект из памяти. В СОМ каждый активизированный объект ведет подсчет сделанных на него ссылок. При обнулении этого счетчика кокласс удаляет себя из памяти. Метод AddRef() вызывается при появлении новой ссылки на объект и увеличивает значение счетчика (в нашем случае это m refcount) на 1. Возвращает данный метод текущее число ссылок.

    • Release ()

    Этот метод вызывается при освобождении ссылки на объект и уменьшает значение счетчика на 1. Он же удаляет кокласс из памяти при обнулении счетчика ссылок. Метод возвращает текущее число ссылок.

    Теперь реализация класса CoBоок

    //////////////////////////////////////////////////

    // СоВоок. срр: реализация класса СоВоок.

    //

    //////////////////////////////////////////////////

    #include <stdio.h>

    #include "СоВоок. h"

    extern ULONG g_objCount; // Счетчик числа объектов

    //////////////////////////////////////////////////

    // Конструктор и деструктор

    //////////////////////////////////////////////////

    СоВоок::СоВоок()

    {

                  m_refCount = 0;

                  ++g_obj Count;

                  m_bstrTitle = SysAllocString(L"");

                  m_bstrAuthor = SysAllocString(L"");

    }

    CoBook::~CoBook()

    {

                 -- g_objCount;

                 if(m_bstrTitle)

                            SysFreeString(m_bstrTitle);

                  if(m_bstrAuthor)

                            SysFreeString(m_bstrAuthor);

    }

    //

    1 ... 196 197 198 199 200 201 202 203 204 ... 361
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Валентина Валентина04 июль 13:25 Большое спасибо за интересную тему.  Сюжет заманчиввй,интересный. Жду продолжения ... Лекарь Фамильяров. Том 7 - Александр Лиманский
    2. Наталья По Наталья По01 июль 10:12 Ужасный перевод:(... Аркадия - Эрин Дум
    3. Вика Вика29 июнь 21:56 Какая хрень с первых строк.  У ребенка в 14 месяце не может быть черепно мозговой травмы при падании с дивана ... Вернуть семью любой ценой - Чарли Ви
    Все комметарии
    Новинки бесплатной онлайн библиотеки