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 ... 197 198 199 200 201 202 203 204 205 ... 361
    Перейти на страницу:
    IUnknown

    STDMETHODIMP_(ULONG) CoBook::AddRef()

    {

                   return ++m_refCount;

    }

    STDMETHODIMP_(ULONG) CoBook::Release()

    {

                  if (--m_refCount == 0)

                  {

                              delete this;

                              return 0;

                   }

                   else

                              return m_refCount;

    }

    STDMETHODIMP CoBook::Querylnterface(REFIID riid, void** pIFace)

    {

                    if (riid == IID_IUnknown)

                    {

                                *pIFace = (IUnknown*)this;

                    }

                    else if (riid == IID_IPub)

                    }

                                *pIFace = (IPub*)this;

                     }

                    else if (riid == IID_IBook)

                     {

                                *pIFace = (IBook*)this;

                     }

                     else

                     {

                                *pIFace = NULL; return E_NOINTERFACE;

                     }

                     ((IUnknown*)(*pIFace))->AddRef();

                     return S OK;

    }

    //IPub&IBook

                     STDMETHODIMP CoBook::SetTitle (BSTR bstrTitle)

                     {

                                SysReAllocString(&m_bstrTitle, bstrTitle);

                                return S_OK;

                      }

                      STDMETHODIMP CoBook::SetYear(int nYear)

                      {

                               m_nYear = nYear;

                               return S_OK;

                      }

                      STDMETHODIMP CoBook::SetAuthor(BSTR bstrAuthor)

                      {

                               SysReAllocString(&m_bstrAuthor, bstrAuthor);

                               return S_OK;

                       }

                       STDMETHODIMP CoBook::Getlnfo(BSTR *pbstrInfo)

                       {

                             char* pszTitle = NULL;

                             char* pszAuthor = NULL;

                             char* pszText = NULL;

                             int nAuthorLength, nTitleLength;

                             nAuthorLength = SysStringLen(m_bstrAuthor);

                             nTitleLength = SysStringLen(m_bstrTitle);

                             pszAuthor = (char*)malloc(2*nAuthorLength);

                             pszTitle = (char*)malloc(2*nTitleLength);

                             pszText = (char*)malloc(2*nAuthorLength + 2*nTitleLength + 50);

                             wcstombs(pszTitle, m_bstrTitle, 2*nTitleLength);

                             wcstombs(pszAuthor, m_bstrAuthor, 2*nAuthorLength);

                             sprintf(pszText,

                                  "BooknnAuthor: %snTitle: %snYear: %d", pszAuthor, pszTitle, m_nYear);

                                      *pbstrInfo = SysAllocStringLen(NULL, 2*strlen(pszText));

                              mbstowcs (*pbstrInfo, pszText, 2*strlen (pszText));

                              free(pszAuthor);

                              free(pszTitle);

                              free(pszText);

                              return S_OK;

              }

    В конструкторе CoBook () задается начальное нулевое значение для счетчика числа ссылок на данный объект и увеличивается на 1 глобальный счетчик объектов. Глобальный счетчик объектов используется при принятии решения о возможности удаления из памяти сервера, возможно содержащего не только класс CоBоок, но и какие-то другие классы. Кроме того, члены класса m_bstrTitie и m_bstrAuthor получают в качестве значения пустую строку. Префикс L перед строкой константой говорит о том, что в этой строке на один символ отводится два байта. Для ее преобразования к типу BSTR и размещения в памяти используется функция SysAllocString ().

    В деструкторе CоBооk () при уничтожении объекта на 1 уменьшается счетчик объектов и освобождается память, выделенная ранее для заголовка публикации и имени автора. Для освобождения памяти, выделенной под BSTR-строку, используется функция SysFreeString ().

    Реализация методов AddRef () и Release () тривиальна и полность соответствует предписанной семантике этих методов.

    Метод Query inter face () обеспечивает переход между любыми двумя интерфейсами, реализованными в коклассе совоок. Заметим, что среди этих интерфейсов не только IBook, но и все интерфейсы, от которых прямо или косвенно IBook порожден — IPub и IUnknown. Если запрашиваемый интерфейс не найден, возвращается E_NOINTERFACE. В противном случае вызывается метод AddRef () интерфейса IUnknown, увеличивающий счетчик ссылок на данный объект. Вызвать функцию Release () при освобождении ссылки, полученной в результате вызова QueryInterface () обязан уже клиент.

    Методы SetTitle (), SetYear () и SetAuthor () позволяют задать соответственно название, год издания и имя автора книги — нового объекта CоBооk. При передачи в качестве входного аргумента BSTR-строки происходит переразмещение в памяти соответствующей BSTR-строки — члена класса. Для этого используется функция SysReAllocstring ().

    Метод GetInfо () возвращает информацию о книге в строке типа BSTR. Вся информация о книге хранится в экземпляре класса CоBооk в виде BSTR-cтрок и целого числа. В процессе формирования результирующей строки все BSTR-строки преобразуются в ANSI-строки. Для выполнения преобразования BSTR-строки в ANSI-строку применяется функция wcstombs (). Первый параметр задает буфер для ANSI-строки, второй — BSTR-строку, третий — размер буфера. Функция SysStringien () позволяет определить длину BSTR-строки в символах. Размер буфера для соответствующей ANSI-строки выбирается в два раза превосходящим длину BSTR-строки, т. к. некоторые Unicode-символы представляются двумя ANSI-символами. Далее в буфер pszText помещается вся выводимая информация, выделяется память под возвращаемую BSTR-строку *pbstrInfо и вызывается функция преобразования ANSI-строки pszText в BSTR-строку *pbstrInfо-mbstowcs().

    Для выделения памяти под возвращаемую строку используется функция SysAlloSstringLen (). Первый параметр задает BSTR-строку, первые символы которой, в количестве равном второму параметру, заносятся в новую строку. Задав в качестве первого параметра null мы получаем неинициализированную BSTR-строку длины, заданной вторым параметром.

    Последнее действие — освобождение памяти, выделенной под буферы.

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

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

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

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

    #ifndef _CoJournal_

    #define _CoJournal_

    #include "IJournal.h"

    #include "iid.h"

    class CoJournal:

              public IJournal

    {

    public:

              CoJournal ();

              virtual ~CoJournal();

              // IUnknown

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

              STDMETHODIMP_(ULONG) AddRef();

              STDMETHODIMP_(ULONG) Release();

              // IPub

               STDMETHOD(SetTitle)(BSTR bstrTitle);

               STDMETHOD(SetYear)(int nYear);

               STDMETHOD(Getlnfo)(BSTR* pbstrlnfo);

               // IJournal

               STDMETHOD(SetNumber)(int nNumber);

    private:

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

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

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

               int m nNumber; // Номер журнала

    };

    #endif

    И теперь реализация класса CоJournal

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

    // СоJournal.cpp: реализация класса CoJournal.

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

    #include <stdio.h>

    #include "CoJournal.h"

    #include <stdio.h>

    #include "CoJournal.h"

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

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

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

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

    CoJournal::CoJournal()

    {

              m_refCount = 0;

              ++g_obj Count;

              m_bstrTitle = SysAllocString(L"");

    }

    CoJournal::~CoJournal()

    {

              -- g_objCount;

              if(m_b strTitle)

                            SysFreeString(m_bstrTitle);

    }

    // IUnknown

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

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


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

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

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


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

    Новые отзывы

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