![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Обмен данными между процессами
Рисунок 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);
|