Визуальное программирование и MFC

       

Усовершенствование сервера – добавление COM-объекта


Разработав программу внутреннего сервера обобщенного типа, для реализации предоставляемых сервером COM-объектов можно приступать к дополнению его классами MFC. Чтобы создать класс для организации взаимодействия с механизмом, можно использовать любой класс, производный от CCmdTarget библиотеки MFC (CWnd и многие другие).

Итак, чтобы сделать сервер более практичным, необходимо создать новый класс на основе CCmdTarget — основного класса автоматизации в библиотеке MFC. Для этого следует выполнить следующие действия:

  • выберите команду “New Class” мастера ClassWizard;
  • в поле “Name” ввести имя класса, например CSimpleMFC;
  • в поле “Base Class” указать CCmdTarget;
  • в разделе “Automation” указать “Createable by type ID” и убедиться, что в поле введен текст, например SvrDll.SimpleMFC.
  • Остановимся подробнее на последнем пункте. Для того чтобы новый класс работал с механизмом автоматизации, следует выбрать один из следующих двух вариантов раздела “Automation”:

  • Automation, предоставляющий таблицу свойств и методов; или
  • Createable by type ID (Создаваемый по идентификатору типа объекта), который, помимо этого, присваивает некоторое имя и параметр GUID для идентификации объекта в системном реестре.
  • Вариант Createable следует использовать, когда необходимо предусмотреть возможность создания объекта автоматизации внешними средствами, например с помощью функции CreateObject из арсенала Visual Basic. Вариант Automation пригодится лишь в случае, когда классы, обладающие средствами работы с механизмом автоматизации, будут создаваться только через другой аналогичный объект - например как составная часть иерархии объектов.

    Выбрав вариант Createable, следует ввести псевдоним (programmatic ID) для своего объекта - т. е. наименование, по которому его можно будет найти в системном реестре Этот параметр всегда строится по следующему принципу: ИмяМодуля.ИмяОбъекта[.номер_версии]. Рекомендуется PROGID сделать максимально информативным.

    Созданный мастером ClassWizard класс CSimpleMFC и является С++ -классом COM-объекта SvrDll.SimpleMFC, реализующим его интерфейс IID_ISimpleMFC (он наследуется от интерфейса IDispatch).




    Для добавления в интерфейс COM-объектов специализированных методов
    (реализовываться они будут в классе CSimpleMFC) следует:



  • запустить ClassWizard;


  • переключится на его панель “Automation”;


  • нажать кнопку “Add Method…”, в результате появится диалоговое окно “Add Method”;


  • в этом диалоге указать название метода (поле “External name”), имя компонентной функции Cи++ (метод класса CSimpleMFC), которая будет выполняться при выборе данного метода (поле “Internal name”), тип возвращаемого значения этого метода и его аргументы, если таковые имеются.


  • При добавлении новых методов автоматизации (видимых клиентом) ClassWizard вносит в таблицу параметров и методов (в схему диспетчеризации BEGIN_DISPATCH_MAP - END_DISPATCH_MAP класса CSimpleMFC), новый элемент. Допустим, добавлен новый метод, имеющий следующее объявление: afx_msg void Initialize (long initializer);. Тогда в схему диспетчеризации класса будет добавлена строка в следующем формате:

    DISP_FUNCTION(CSimpleMFC, "Initialize", Initialize, VT_EMPTY, VTS_I4)



    Для того, чтобы добавить COM-объекту параметр (свойство)
    следует

  • выбрать панель “Automation” мастера ClassWizard;


  • нажать кнопку “Add Property...”, чтобы перейти в диалоговое окно с таким же именем;


  • в этом диалоге выбрать один из двух представленных вариантов реализации нового параметра: через пару принадлежащих классу функций Get/Set или через комбинацию какого-либо элемента данных (для хранения значения этого параметра) и функции реакции на изменение этого параметра.




  • В
    первом варианте обеспечивается большая степень контроля при считывании или задании клиентом нового значения для параметра; однако в этом случае в классе не выделяется память под новый параметр. Во втором варианте выделение памяти для параметра предусмотрено, однако COM-объект будет лишь пассивно предупрежден об изменении его значения: функция реакции вызывается механизмом MFC лишь после того, как параметр изменился.

    Допустим, вводится новое свойство NewProp типа short и выбран второй вариант реализации параметра.В ответ мастер ClassWizard добавит в определение класса CSimpleMFC следующие описания:

    short m_newProp; afx_msg void OnNewPropChanged();

    В реализации класса CSimpleMFC появится пока еще "пустая" функция реакции на изменение параметра CSimpleMFC::OnNewPropChanged. В схему диспетчеризации при этом будет добавлена следующая строка:

    DISP_PROPERTY_NOTIFY(CSimpleMFC,"NewProp",m_newProp, OnNewPropChanged,VT_I2)

    После компиляции и компоновки приложения следует зарегистрировать DLL-сервер в реестре операционной среды Windows. Для этого следует выбрать команду “RegisterControl” меню “Tools” среды Microsoft Developer Studio.


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