Модель программирования Component Object Model. Разработка COM-сервера, страница 21

Теперь проинспектируйте изменения в окне Class View. Выполните двойной щелчок сначала на методе Say, который расположен внутри класса CSay, а затем повторите эту операцию на элементе Say, который расположен внутри независимого узла ISay. В первом случае вы попадете в файл реализации класса CSay, а во втором — в IDL-файл. В файл Say.cpp надо ввести такой код конструктора.

STDMETHODIMP CSay::Say()

{

USES_CONVERSION;

MessageBox (0, W2A(m_word), "Interface ISay:", MB_OK);

return S_OK;

}

Здесь, благодаря классу CComBSTR и макросам USES_CONVERSION и W2A (с мнемоникой Wide To ANSI), удается вывести сообщение с меньшими усилиями, чем во всех предыдущих вариантах реализации метода Say. Повторите шаги по вводу в интерфейс нового метода и добавьте метод SetWord. При описании параметра необходимо в соответствии  с правилами COM уточнить его тип, выбрав в поле Parameter type: BSTR. В поле Parameter name введите: word. Установите, также флажок in, который уточняет тип параметра (входной). Эта информация используется в файле типа IDL.

Не забудьте нажать кнопку Add, а затем Finish. Мастер вставок может наглым образом проигнорировать параметр, если вы забудете нажать Add. В этом случае вам придется ввести исправления вручную. Это надо проделать в трех файлах: Say.h, Say.cpp и ATest.idl.

В файле Say.h должно быть объявление:

STDMETHOD(SetWord)(BSTR word);

В файле Say.cpp коды реализации метода:

STDMETHODIMP CSay::SetWord (BSTR word)

{

m_word = word;

return S_OK;

}

В файле ATest.idl — коды уточненного описания метода:

[helpstring("method SetWord")] HRESULT SetWord([in] BSTR word);

Вновь постройте DLL. Признаком успеха может служить сообщение компоновщика:

Creating library Debug/ATest.lib and object Debug/ATest.exp

Создание клиента

Для проверки работы сервера можно воспользоваться последним клиентом SayTLibClient, который был разработан ранее. Но в него необходимо ввести изменения: путь к библиотеке типов нового сервера, а также имя класса. Вместо идентификатора CLSID_CoSay вставьте CLSID_Say. Напомним код клиентского приложения.

#import "D:/ATest/Debug/ATest.tlb" no_namespace named_guids

void main()

{

CoInitialize(0);

ISayPtr pSay(CLSID_Say);

pSay->Say();

pSay->SetWord (L"I obey your will, Master !");

pSay->Say();

pSay = 0;

CoUninitialize();

}

Введите изменения и запустите клиентское приложение. Все должно работать. Другой текст приветствия должен  убедить вас в том, что работает новый сервер, а не старый.

Создание элемента ActiveX

Элементы ActiveX (термин, используемый для обозначения одного из исторических этапов развития COM-технологии в Microsoft) должны, как минимум, обладать способностью к активизации на месте, поддерживать OLE Automation, разрешать (как и простые объекты) чтение и запись своих свойств, а также вызов своих методов.

В этой главе мы разработаем DLL-модуль, который после регистрации в системе в качестве COM-объекта, позволит любому другому клиентскому приложению (которое должно обладать свойствами контейнера объектов COM) использовать его для отображения в контексте OpenGL трехмерного графика функции, заданной произвольным массивом чисел.

Данные для графика COM-объект будет брать из файла, на который укажет пользователь клиентского приложения. Кроме этого, объект предоставит клиенту возможность перемещения графика вдоль трех пространственных осей, вращения вокруг вертикальной и горизонтальной осей и просмотра поверхности как в обычном, так и скелетном режиме. Регулируя параметры освещения, пользователь может добиться наибольшей реалистичности изображения, то есть усилить визуальный эффект трехмерного пространства на плоском экране.

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