Средства обмена данными между приложениями
Цель работы: практическое знакомство со средствами передачи данных между процессами, (Interprocess Communications-IPC), выполняющимися на одном компьютере.
Краткие теоретические сведения
В данной работе будут рассмотрены только два метода IPC:
· использование буфера обмена (Clipboard);
· файлы, проецируемые в память.
Использование буфера обмена
Буфер обмена (clipboard) в основном используется для удобства пользователей и редко используется как метод IPC. В Delphi для вырезания, копирования и вставки данных используется класс Tclipboard, объявленный в модуле Clipbrd. Данный модуль необходимо добавить в оператор uses.
Класс Tclipboard имеет следующие свойства:
· AsText. Это свойство, имеющее тип String, используется для копирования текста в буфер обмена и вставки его из буфера обмена. Поскольку AsText представляет собой строку Pascal, ее длина ограничена 255 символами. При работе с текстом большего объема следует использовать методы SetTextBuf и GetTextBuf.
В буфере обмена могут находиться данные различных типов. Если буфер обмена содержит текст, выражение Clipboard.HasFormat (cf_Text) соответствует истине.
Для растровой графики используйте тип сf_Bitmap.
· FormatCount. Свойство типа Integer равно количеству элементов в массиве Formats.
· Formats. Массив значений, имеющих тип Word и представляющих собой зарегистрированные форматы данных буфера обмена.
Для копирования графики в буфер обмена следует использовать метод Assign. Например
Clipboard.Assign (Image1.Pictire); // копирование в буфер обмена
Image2.Picture.Assign (Clipboard); // копирование из буфера обмена
Использование файлов, проецируемых в память
Ниже приведен текст DLL, используемой для создания области в страничном файле, доступ к которой могут иметь несколько процессов.
library ShareHeap;
uses
SysUtils, Classes, Windows;
const MaxSize =1000;
var
hObjHand : Thandle;
pGMem : pointer;
procedure UnmapMemory;
begin
if Assigned (pGMem) then
begin
UnMapViewOfFile (pGMem);
pGmem := nil;
end;
if hObjHand >0 then CloseHandle (hObjHand);
hObjHand :=0;
end;
procedure MapMemory (dwAllocSize : dword);
begin
hObjHand :=CreateFileMapping(MaxDword, nil,
PAGE_READWRITE,0, dwAllocsize,Pchar('Gmem'));
if (hObjHand = 0) then
Raise Exception.Create('Не создан file-mapping Obj');
pGMem := MapViewOffile(HobjHand,File_Map_Write,0,0,1);
if not Assigned(pgmem) then
begin
UnMapMemory;
Raise Exception.Create('Could not map file');
end;
end;
procedure DLLMain (dwAct : Dword);
begin
case dwAct of
dll_Process_Attach :
begin
pgMem := nil;
hObjHand :=0;
MapMemory(MaxSize);
end;
dll_Process_Detach:
UnmapMemory;
end;
end;
// получение блока памяти из страничного файла
function GetBlock : pointer; StdCall;
begin
result := pGmem;
end;
exports GetBlock;
begin
DLLProc := @DLLMain;
DLLMain (dll_Process_Attach);
end.
Ниже приведен пример фрагмента текста приложения, использующего функцию GetBlock из библиотеки ShareHeap для передачи строки символов между приложениями.
var
pcBuf : Pchar;
function GetBlock : pointer; stdcall;
external 'SHAREHEAP.DLL';
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
pcbuf := GetBlock;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.GetTextBuf(pcBuf,Length(Edit1.Text)+1);
// Memo1.SetTextBuf (pcbuf); // timer1.Enabled:=True;
// edit2.SetTextBuf(pcBuf);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Memo1.SetTextBuf (pcbuf);
// edit2.SetTextBuf(pcBuf); // timer1.Enabled:=false;
end;
Порядок выполнения работы
1. Написать приложение, выполняющее занесение в буфер обмена текста и графики и приложение, получающее из буфера обмена находящиеся в нем данные.
2. Создать DLL для экспорта функции получения блока данных в страничном файле.
3. Написать приложение для обмена данными с использованием созданной в п.2 функции GetBlock.
Отчет о работе
Для отчета о работе используются экранные формы разработанных в п.1 и п.3 приложений.
Лабораторная работа № 5
Реестр и средства работы с реестром
Цель работы: освоение методики и функций Win32 для работы с реестром. Знакомство с компонентом Registry, его свойствами и методами.
Структура реестра
Реестр - это база данных, которая является частью операционной системы Windows 9x или NT.
Реестр хранит информацию, используемую для инициализации и конфигурирования приложений и управляет доступом к ней. Все технологии на платформе Windows интенсивно используют реестр.
Реестр Windows 9x состоит из файлов user.dat и system.dat, представляющих собой скрытые файлы, находящиеся в каталоге \Windows. ПЕРЕД началом работы с реестром необходимо сохранить копию этих файлов.
Реестр имеет иерархическую структуру и состоит из разделов и пар параметр-значение. Структура реестра напоминает иерархическую структуру каталогов Windows - разделы можно представлять себе в виде папок, а пары параметр-значение - в виде файлов. Редактор реестра RegEdit - основной инструмент пользователя для манипуляции с реестром, предоставляемый Microsoft.
Разделы
Раздел - это узел структуры реестра. Он состоит из подразделов и пар параметр-значение. Имя подраздела должно быть уникальным внутри его родительского раздела. Для отделения имен родительских разделов от дочерних используется символ \
HKEYs
Разделы HKEYs - это средство доступа к разделам реестра самого верхнего уровня. Они определяются в API реестра и являются точкой входа в дерево реестра. В реестре есть ДВА основных раздела - HKEY_LOCAL_MACHINE и HKEY_USERS (которые хранятся соответствен-но в файлах system.dat и user.dat) и четыре дополнительных раздела.
Пары параметр-значение
Пара параметр-значение - компонент реестра, который непосредственно хранит данные. Используя путь к разделу и имя параметра, можно считать значение из пары параметр-значение.
Значение, находящееся в паре, может иметь один из нескольких типов. Три основных типа данных- двойное слово (DWORD), строка (String) и двоичное значение (Binary).
Редактор реестра
Для запуска редактора реестра используется меню Пуск-> Выполнить. В окне имени файла необходимо ввести regedit и нажать ОК. Редактор реестра дает возможность просматривать содержимое реестра, создавать и удалять подразделы и пары параметр-значение, выполнять экспорт-импорт всего реестра или его части.
НИКОГДА НЕ УДАЛЯЙТЕ ПОДРАЗДЕЛЫ и ПАРЫ ПАРАМЕТР_ЗНАЧЕНИЕ, которые ВЫ не создавали!
Редактор реестра поддерживает только три типа данных (перечисленные выше) из 9. Для выполнения операций с данными других типов необходимо использовать функции Win32 API.