ActiveX с нуля

Схема диспетчеризации класса


В объявлении класса присутствует макрос DECLARE_DISPATCH_MAP, который объявляет схему диспетчеризации. Посредством нее элемент управления связывает свои свойства с соответствующими методами записи, чтения и оповещения (последние вызываются при изменении значения свойства). Дополнительно устанавливается связь между идентификаторами диспетчеризации (DISPID) и фактическими методами.

Сначала схема диспетчеризации в файле реализации

(

BEGIN_DISPATCH_MAP(CMyCtrlCtrl, COleControl

END_DISPATCH_MAP()

)

имеет одну запись, сделанную при помощи макроса DISP_FUNCTION_ID, который связывает между собой следующие элементы: имя класса; внешнее имя метода; идентификатор (DISPID) метода; метод C++, соответствующий вызову метода автоматизации; список параметров метода (тип VARIANT); тип значения, возвращаемого методом (тип VARIANT). Эта информация необходима системе для того, чтобы направлять вызовы методов автоматизации по правильному пути. Когда контроллер автоматизации вызывает метод при помощи его внешнего имени, такой вызов преобразуется в вызов внутренней функции элемента управления. В основе этого механизма лежит DISPID. Каждому объявленному свойству или методу должен соответствовать свой макрос в схеме диспетчеризации класса.

При создании свойств и методов элементов в раздел

BEGIN_DISPATCH_MAP(CMyCtrlCtrl, COleControl)

END_DISPATCH_MAP()

добавляются соответствующие строки.



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