Разработка сервера
Сейчас мы займемся разработкой DLL СОМ-сервера, выполняемого в пространстве процесса другого (клиентского) приложения. Для того чтобы понять, что кроется за этой вывеской, мы для начала создадим минимально-простой СОМ-объект и при этом специально не будем пользоваться какими-либо библиотеками или инструментами Studio .NET.
Наш объект будет предоставлять миру только один интерфейс isay, инкапсулирующий два метода: Say и SetWord. Первый метод выводит текстовую строку типа BSTR в окно типа MessageBox, а второй – позволяет изменять эту строку. Тип BSTR в Win32 является адресом двухбайтовой Unicode-строки. Его советуют использовать в СОМ-объектах для обеспечения совместимости с клиентскими приложениями, написанными на других языках.
Я надеюсь, что логика, заложенная в этом простом приложении, поможет вам не терять нить повествования при разработке следующего, более сложного объекта с помощью ATL. Использование ATL и инструментов Studio .NET упрощают разработку СОМ-объектов, но скрывают суть происходящего, вызывая иногда чувство досады и неудовлетворенности. С помощью мастера AppWizard создайте шаблон приложения типа Win32 Dynamic-Link Library (Динамически компонуемая библиотека Win32) под именем МуСоm.
- Дайте команду File › New Project. В диалоге New Project выберите шаблон Win32 Project под именем МуСоm и нажмите ОК.
- В окне Win32 Application Wizard откройте вкладку Application Settings, установите переключатель Application Type в положение DLL, включите флажок Empty Project и нажмите кнопку Finish.
- Подключите к проекту новый файл типа C/C++ Header File. Для этого дайте команду Project › Add New Item. В диалоге Add New Item выберите шаблон Header File (.h), а в поле Name задайте имя interfaces.h и нажмите кнопку Open
- Введите в этот файл нижеследующие директивы препроцессора и описание интерфейса ISay.
Примечание
Это же действие можно выполнить более сложным способом, но зато сход-ным с тем, как это делалось в Visual Studio 6. Дайте команду File › New › File, выберите тип файла и нажмите кнопку Open. Кроме этих действий придется записать новый файл в папку с проектом и подключить его. Для этого используется команда Project › Add Existing Item с последующим поиском файла. Альтернативой этому является перетаскивание существующего файла в окне Solution Explorer из папки Resource Files в папку Header Files.
//=== Эти директивы нужны для того, чтобы не допустить //=== повторное подключение файла # if!defined (MY_ISAY_INTERFACE) # define MY__ISAY_INTERFACE # pragma once //====== Для того, чтобы были доступны COM API #include <windows.h> //====== Для того, чтобы был виден lUnknown #include <initguid.h> // Интерфейс ISay мы собираемся зарегистрировать и // показать миру. Он, как и положено, происходит от // IUnknown и содержит чисто виртуальные функции interface ISay: public lUnknown { //=== 2 метода, которые интерфейс //=== предоставляет своим клиентам virtual HRESULT _ stdcall Say 0=0; virtual HRESULT _ stdcall SetWord (BSTR word)=0; } # endif