принимает описатель объекта файлового отображения, полученный в результате выполнения функции CreateFileMapping и освобождает его. Для правильного завершения работы с объектом файлового отображения сначала следует применить функцию UnMapViewOf File, а затем CloseHandle.
Сама проекция файла будет удалена только после того, как будут закрыты все дескрипторы во всех использующих эту проекцию процессах.
Для демонстрации работы проецируемых в память файлов создадим приложение, которое будет записывать в такой файл строку и спустя некоторое время считывать ее оттуда. Для этого нам понадобится стандартный TextBox, кнопка, метка и таймер. Программа будет работать следующим образом: строка, записанная в поле редактора, после нажатия кнопки помещается в проецируемый файл. Далее, спустя некоторое время (задается таймером), содержимое файла считывается и задается в качестве заголовка метки (рис. 8.2).
Рис. 8.2. Вид приложения, использующего проецируемый файл
В секцию описания переменных программы помещаем следующие объявления:
var
FormMap pingFile: TFormMappingFile;
//Глобальные переменные
//Описатель объекта проецируемого файла
hFileMapObj:THandle;
//Указатель на начальный адрес данных
lpBaseAddress:PChar;
Далее рассмотрим, какие действия выполняются при загрузке формы. Создание проецируемого файла и его отображение в адресное пространство процесса выполняется в момент создания формы (листинг 8.7).
Листинг 8.7.
Создание формы приложения
procedure TMappingFile.FormCreate(Sender: TObject);
begin
//Создаем проецируемый файл с именем FileMemory
//и передаем полученный в результате описатель
//в глобальную переменную hFileMapObj
hFileMapObj := CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,
0,4,’FileMemory’);
If (hFileMapObj = 0) Then
ShowMessage('Не могу создать проецируемый файл!')
Else
//Подключаем файл к адресному пространству
//и получаем начальный адрес данных
lpBaseAddress := MapViewOfFile(hFileMapObj,FILE_MAP_WRITE,
0,0,0);
If lpBaseAddress = Nil Then
ShowMessage('Не могу подключить проецируемый файл! ');
end;
После инициализации файла его можно использовать. Приведем листинг обработчика, копирующего данные в проецируемый файл (листинг 8.8).
Листинг 8.8. Копирование данных в проецируемый файл
procedure TMappingFile.bnOKClick(Sender: TObject);
begin
//Считываем данные в проецируемый файл
StrPCopy (lpBaseAddress,edVariable.Text);
end;
После того как будет нажата кнопка, данные помещаются в проецируемый файл. По истечении некоторого времени, заданного таймером, строка устанавливается в качестве текста метки (листинг 8.9).
Листинг 8.9.
Считывание данных из проекции файла
procedure TMappingFile.TimerMFTimer(Sender: TObject);
begin
lbVariable.Caption := PChar (lpBaseAddress);
end;
В момент завершения приложения необходимо отключить проецируемый файл от адресного пространства процесса и закрыть объект файла. Эти действия можно выполнять в момент уничтожения формы (листинг 8.10).
Листинг 8.10.
Уничтожение формы приложения
procedure TMappingFile.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
//Отключим файл от адресного пространства
UnMapViewOfFile(lpBaseAddress);
//Освобождаем объект файла
CloseHandle(hFileMapObj);
//Закрываем форму
Action := caFree;
end;
Здесь рассмотрен простой пример работы с проекцией файла в рамках одного приложения. Более же интересный и реальный пример вы увидите в разд. 10.2 при рассмотрении программы «Оконный шпион»: там проекция файла в память используется для передачи данных из функции DLL, работающей в памяти другого процесса.
Глава 9 Возможности COM в Microsoft Word и Microsoft Excel
• Технология OLE
• Технология COM
• Использование OLE в Delphi
• Управление Microsoft Word и Microsoft Excel
Технология COM/DCOM является одной из важных и широко используемых современных технологий. Охватить все аспекты технологии COM/DCOM очень сложно, и в рамках данной книги в этом нет необходимости. В этой главе будут рассмотрены основные возможности СОМ и их практическое применение. Примеры, разобранные в главе, демонстрируют управление приложениями, снабжаемыми СОМ-объектами. К таким приложениям можно отнести все программы из пакета Microsoft Office (Microsoft Word, Microsoft Excel и т. д.).
9.1. Технология OLE
В Windows 3.1 и более ранних версиях основным средством обмена данными между программами была технология DDE – Dynamic Data Exchange (динамический обмен данными). На этой технологии основывалась технология OLE – Object Linking and Embedding (связывание и внедрение объектов). OLE позволяет делать документы одного приложения частью документов другого приложения. Таким образом, пользователь получил возможность применять функции различных программ для редактирования одного документа.
В основе DDE лежит обмен сообщениями между окнами операционной системы. Подобный механизм затрудняет распараллеливание процессов и обмен данными через сеть между приложениями, работающими на разных компьютерах. Это привело к созданию расширения DDE – NetDDE, но эта технология работает медленно и неустойчиво.
Начиная с Windows NT 3.51, внедряется технология OLE 2 – дальнейшее развитие OLE. OLE 2 дополнительно включает в себя технологию ActiveX. Позже термин OLE 2 изменили на OLE.
Технология DDE была недостаточной для поддержки OLE 2, поэтому специально для нее была создана технология взаимодействия между программами – СОМ (Component Object Model, модель компонентных объектов). СОМ оказалась очень удачной технологией, поэтому, начиная с Windows 95, DDE была объявлена устаревшей, а основной технологией обмена данными в системе стала технология СОМ.
9.2. Технология СОМ
Модель СОМ построена по принципу архитектуры «клиент – сервер». Сервер предоставляет список возможных действий (функций), которые могут использоваться клиентским процессом. Таким образом, серверный процесс позволяет обрабатывать запросы клиента, выполняя некоторые действия. Когда взаимодействие между клиентом и сервером подразумевает обмен данными, эти данные передаются в качестве параметров функций. При необходимости клиент также может экспортировать функции, которые могут быть вызваны сервером.
В основе СОМ лежат ключевые понятия, которые характерны и для объектно- ориентированного программирования: инкапсуляция, наследование и полиморфизм. Рассмотрим их применительно к объектам СОМ.
Инкапсуляция позволяет скрыть методы (функции) и данные от использования другими объектами. Этот механизм необходим для обеспечения безопасности и надежности конечной системы. Термин «метод» использован не случайно, объекты СОМ строятся по принципу классов в программировании (класс имеет название CoClass, приставка Со говорит о том, что это класс СОМ).
Наследование позволяет многократно использовать готовые решения. Создавая объект и наследуя некоторые свойства (данные) и методы (функции), мы можем использовать их в дальнейшем. Механизм наследования в связке с принципом полиморфизма позволяет создавать иерархии СОМ-классов для эффективного решения любых задач. Кроме наследования, часто используется и агрегация – внедрение ранее реализованных объектов внутрь вновь разрабатываемых.
Полиморфизм позволяет переопределять реализацию (поведение) унаследованных функций и данных. Это дает возможность более гибко строить иерархию классов, снижая тем самым сложность реализации программ.
Изначально технология СОМ обеспечивала межпроцессное взаимодействие только на локальном компьютере. Эволюция СОМ привела к созданию DCOM (Distributed СОМ, распределенная СОМ), позволяющей работать с объектами, которые расположены на различных и удаленных друг от друга компьютерах.
На данный момент DCOM является межплатформенной технологией. Существуют средства для поддержки DCOM в различных UNIX-системах (в том числе Linux), Solaris, MacOS, VxWorks.
9.3. Использование OLE в Delphi
Как и многие современные среды программирования, Delphi поддерживает возможность автоматизированной разработки