Использование макросов COM
Разработчики COM рекомендуют для повышения надежности и переносимости компонентов использовать при их разработке множество макроопределений, которые вы также вынуждены будете использовать при разработке проекта на базе ATL. Например, макрос STDMETHODIMP при раскрытии заменяет спецификаторы HRESULT _stdcall. Для того чтобы приобрести навыки использования макросов СОМ, мы применим их в файлах MyCom.h и MyCom.cpp. Сравнивая старую и новую версии этих файлов, вы без труда поймете смысл макроподстановок. В файл MyCom.h ведите коррекцию кодов так, как показано ниже:
# ifIdefined (MY_COSAY_HEADER) #define MY_COSAY_HEADER #pragma once #include "MyComTLib_h.h" class CoSay: public ISay //====== Класс, реализующий интерфейсы ISay, lUnknown public: CoSay ('); virtual – CoSay(); // lUnknown STDMETHODIMP QuerylnterfacefREFIID riid, void** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // ISay STDMETHODIMP Say(); STDMETHODIMP SetWord (BSTR word); private: //====== Счетчик числа пользователей классом ULONG m_ref; //====== Текст, выводимый в окно BSTR m_word; }; //====== Фабрика классов СОМ DLL-сервера class CoSayFactory: public IClassFactory { public: CoSayFactory(); virtual ~CoSayFactory(); // lUnknown STDMETHODIMP QueryInterface(REFIID riid, void** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IClassFactory STDMETHODIMP Createlnstance(LPUNKNOWN pUnk, REFIID riid, void** ppv); STDMETHODIMP LockServer(BOOL bLock); private: ULONG m_ref; }; #endif
Теперь перейдите к файлу MyCom.cpp и произведите замены в соответствии с текстом, приведенным ниже:
#include "MyComTLib_i.c" #include "MyCom.h" //====== Произвольный ограничитель длины строк # define MAX_LENGTH 128 //====== Счетчик числа блокировок DLL ULONG gLockCount; //====== Счетчик числа пользователей СОМ-объектами ULONG gObjCount; CoSay::CoSay() { //=== Обнуляем счетчик числа пользователей класса, //=== так как интерфейс пока не используется m_ref = 0; //=== Динамически создаем строку текста по умолчанию m_word = SysAllocString(L"This is MyComTLib speaking"); gObjCount++; } CoSay::-CoSay() { //====== при завершении работы освобождаем память if (m_word) SysFreeString(m_word); gObjCount– ; } //====== Реализация методов lUnknown STDMETHODIMP CoSay::QueryInterface(REFIID riid, void** ppv) { // Стандартная логика работы с клиентом