Шрифт:
Интервал:
Закладка:
Рассмотрим некоторые функции для работы с проецируемым в память файлом. Для того чтобы создать объект файла, проецируемого в память, можно использовать функцию CreateFileMapping. Ее синтаксис выглядит следующим образом:
...function CreateFileMapping(hFile: THandle;
lpFileMappingAttributes: PSecurityAttributes;
flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD;
lpName: PChar ): THandle;
Подробнее рассмотрим параметры функции.
• hFile – идентификатор файла. В результате присвоения этому аргументу значения константы INVALID_HANDLE_VALUE мы свяжем создаваемыйобъект файлового отображения со страничным swap-файлом (системным файлом подкачки).
• lpFileMappingAttributes – указатель на структуру типа TSecurity-Attributes. Структура содержит параметры безопасности создаваемого файла.
• flProtect – параметр, задающий способ совместного использования создаваемого объекта, в случае доступа на чтение и запись принимает значение PAGE_ READWRITE.
• dwMaximumSi zeHigh – старший разряд 64-битного значения размера выделяемого объема памяти.
• dwMaximumSizeLow – младший разряд 64-битного значения размера выделяемого объема памяти.
• lpName – имя объекта проецируемого файла (может быть nil для создания безымянной проекции файла).
Функция возвращает глобальный дескриптор (THandle). Если проецируемый файл не создан, то функция CreateFileMapping возвращает нулевое значение.
После того как проецируемый файл был создан, необходимо отобразить его в адресное пространство процесса. Для этого предназначена функция MapViewOf File, имеющая следующий синтаксис:
...function MapViewOfFile(hFileMappingObject: THandle;
dwDesiredAccess: DWORD;
dwFileOffsetHigh, dwFileOffsetLow,
dwNumberOfBytesToMap: DWORD ): Pointer;
Функция имеет следующие параметры.
• hFileMappingOb j ect – описатель созданного объекта файлового отображения.
• dwDesiredAccess – параметр доступа к полученным данным, в случае чтения и записи принимает значение FILE_MAP_WRITE.
• dwFileOf f setHigh, dwFileOf fsetLow – 64-битное смещение от начала файла.
• dwNumberOf BytesToMap – указывает, сколько байт будет отображено. Если этот аргумент имеет значение 0, то на область памяти будет отображен весь файл.
В результате успешного выполнения функции MapViewOfFile будет получен указатель (тип Pointer) на начальный адрес данных объекта. Указатель будет использоваться в дальнейшем для записи или чтения файла.
Следующей функцией, противоположной по производимым действиям функции MapViewOfFile, является UnMapViewOf File. Она отключает проецируемый файл от текущего процесса:
...function UnMapViewOfFile(lpBaseAddress: Pointer): Boolean;
Функция принимает указатель, возвращаемый MapViewOfFile, и использует его для отмены проекции файла на адресное пространство процесса. В случае успешной выгрузки функция возвращает True, в противном случае – False.
И последняя функция, которую необходимо рассмотреть, – это CloseHandle. Она используется для закрытия дескриптора (многих системных объектов, а не только проекции файла).
...function CloseHandle(hFileMapObj: THandle):Boolean;
Как видно из синтаксиса функции, она принимает описатель объекта файлового отображения, полученный в результате выполнения функции CreateFileMapping и освобождает его. Для правильного завершения работы с объектом файлового отображения сначала следует применить функцию UnMapViewOf File, а затем CloseHandle.
Сама проекция файла будет удалена только после того, как будут закрыты все дескрипторы во всех использующих эту проекцию процессах.
Для демонстрации работы проецируемых в память файлов создадим приложение, которое будет записывать в такой файл строку и спустя некоторое время считывать ее оттуда. Для этого нам понадобится стандартный TextBox, кнопка, метка и таймер. Программа будет работать следующим образом: строка, записанная в поле редактора, после нажатия кнопки помещается в проецируемый файл. Далее, спустя некоторое время (задается таймером), содержимое файла считывается и задается в качестве заголовка метки (рис. 8.2).
Рис. 8.2. Вид приложения, использующего проецируемый файл
В секцию описания переменных программы помещаем следующие объявления:
...var
FormMappingFile: 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. Технология СОМ
Модель СОМ построена по принципу архитектуры «клиент – сервер». Сервер предоставляет список возможных действий (функций), которые могут использоваться клиентским процессом. Таким образом, серверный процесс позволяет обрабатывать запросы клиента, выполняя некоторые действия. Когда взаимодействие между клиентом и сервером подразумевает обмен данными, эти данные передаются в качестве параметров функций. При необходимости клиент также может экспортировать функции, которые могут быть вызваны сервером.
- Excel. Легкий старт - Дмитрий Донцов - Программы
- Фотоприколы с помощью Photoshop - Юрий Гурский - Программы
- 3ds Max 2008 - Владимир Верстак - Программы
- ArchiCAD. Начали! - Андрей Орлов - Программы
- Word 2007. Легкий старт - Дмитрий Донцов - Программы
- Домашняя бухгалтерия и личные финансы на компьютере - Алексей Гладкий - Программы
- 1С:Предприятие. Зарплата и кадры. Секреты работы - Дмитрий Рязанцев - Программы
- Microsoft Access 2007 - Александр Днепров - Программы
- Самые полезные программы: утилиты - Виталий Леонтьев - Программы
- Работа в Интернете - Дмитрий Макарский - Программы