Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Обмен данными между процессами






 

 

Рисунок 1-29 схема обмена данными между приложениями с использованием DLL

 

Для создания общей области, принадлежащей двум процессам, необходимо:

1) Создать общий проецируемый файл с именем или без имени (для решения данной задачи с именем).

TH: = CreateFileMapping (- --‘имя’);

2) Спроецировать отображаемый файл в адресное пространство процесса:

p: =MapViewOfFie(TH, ---, --);

3) Полученный указатель р возвращать каждому приложению.

Действия 1 и 2 должны выполняться для каждого процесса один раз, а действие 3- всякий раз когда возникает необходимость обращаться к области.

Создание Dll, в которой при подключение к процессу (отображение на адресное пространство) с помощью процедуры DllMain будет выполняться действие 1 и 2, а выдача указателя – с помощью экспортируемой функции.

Library Share;

Uses SysUtils, Classes, Windows;

var

HObj: THandle; // отображение объекта отображаемого файла

pMem: Pointer; // указатель на блок

procedure UnMapMemory; // память надо освобождать при завершении приложений, а также при невозможности ее отображения.

begin

If Assigned(pMem) then

begin

UnMapViewOfFile(pMem);

pMem: = nil;

end;

If hObj> 0 then

CloseHandle (hObj);

hObj: =0;

end;

procedure MapMemory (Size: Dword);

//1) begin

hObj: =CreateFileMapping(MaxDword, nil, Page_ReadWrite, 0, Size, PChar(‘_ShareMem’));

//2) pMem: =MapViewOfFile(hObj, File_Read_Write, 0, 0, 1);

If not Assigned (pMem) then

UnMapMemory //удалить отображение

end;

//3) procedure DllMain(Act: Dword);

begin

case kod of

dll_Process_Attach;

begin

pMem: =nil;

hObj: =0;

MapMemory(2000);

end;

Function GetBlock: pointer; stdcall;

begin

result: =pMem;

end;

exports GetBlock;

begin

DllProc: =@DllMain;

DllMain: =(Dll_Process_Attach);

end;

edit2.SetTextBuf(pBuf);

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.