Учебник по Visual C++ .Net


Создание элемента типа ATL Control


Стартовая заготовка элемента ActiveX в окне тестового контейнера

Загляните в файл ATLGLJ.c и увидите три новых макроса типа MIDL_DEFINE_GUID, которые уже выполнили свою работу и поместили в реестр множество новых записей по адресам:

HKEY_CLASSES_ROOT\ATLGL.OpenGL\

HKEY_CLASSES_ROOT\ATLGL.OpenGL.1\

HKEY_CLASSES_ROOT\CLSID\

HKEY_CLASSES_ROOT\ Interface\

Когда клиент СОМ-объекта пользуется услугами локального или удаленного сервера, то есть когда данные передаются через границы различных процессов или между узлами сети, требуется поддержка маршалинга (marshaling). Так называется процесс упаковки и посылки параметров, передаваемых методам интерфейсов через границы потоков или процессов, который мы слегка затронули ранее. Вы помните, что MIDL генерирует код на языке С для двух компонентов: Proxy (представитель СОМ-объекта на стороне клиента) и stub (заглушка на стороне СОМ-сервера). Эти компоненты общаются между собой и решают проблемы Вавилонской башни, то есть преодолевают сложности обмена данными, возникающими из-за того, что клиент и сервер используют различные типы данных — разговаривают на разных языках. Чтобы увидеть проблему, надо ее создать. Интересно то, что при объяснении необходимости этого чудовищного сооружения:

  • idl-файл;

  • новый класс CProxy_iOpenGLEvents в вашем проекте;

  • новый проект ATLGLPS (proxy-stub) в вашем рабочем пространстве;

  • новый тип структур VARIANT, который надо использовать или просто иметь в виду,

    приводится соображение о том, что программы на разных языках программирования смогут общаться, то есть обмениваться данными. Как мы уже обсуждали, разработчики имеют в виду четыре языка, два из которых реально используются (Visual C++ и Visual Basic), а два других (VBScript и Visual J++) едва подают признаки жизни. Правда здесь надо учесть бурное развитие нового языка с#, который, очевидно, тоже участвует в движении СОМ.

    Откройте файл ATLGLidl и постарайтесь вникнуть в смысл новых записей, не отвлекаясь на изучение языка IDL, который потребует от вас заметных усилий и временных затрат. Прежде всего отметьте, что в библиотеке типов (library ATLGLLib), сопровождающей наш СОМ-объект, появилось описание СОМ-класса




    coclass OpenGL

    {

    [default] interface IQpenGL;

    [default, source] dispinterface _IOpenGLEvents;

    };

    который предоставляет своим пользователям два интерфейса. Я не привожу здесь предшествующий классу OpenGL блок описаний в квадратных скобках, который носит вспомогательный характер. Элементы ActiveX используют события (events) для того, чтобы уведомить приложение-контейнер об изменениях в состоянии объекта в результате действий пользователя — манипуляции посредством мыши и клавиатуры в окне объекта. Найдите описание одного из объявленных интерфейсов:

    dispinterface _IOpenGLEvents

    {

    properties:

    methods:

    };

    Пока пустые секции properties (свойства): и methods (методы): намекают на то, что мы должны приложить усилия и ввести, с помощью инструментов Studio.Net в разрабатываемый СОМ-объект способность изменять свои свойства и экспортировать методы. Информация о втором интерфейсе расположена вне блока, описывающего библиотеку типов:

    interface IQpenGL : IDispatch

    {

    [propput, bindable, requestedit, id(DISPID_FILLCOLOR)]

    HRESULT FillColor([in]OLE_COLOR clr);

    [propget, bindable, requestedit, id(DISPID_FILLCOLOR)]

    HRESULT FillColor([out, retval]OLE_COLOR* pclr);

    };


    Содержание раздела