Общий доступ к области отображения файлов (Sharing Memory Mapped Files)... Проверьте нижеследующий код:
var
HMapping: THandle;
PMapData: Pointer;
const
MAPFILESIZE = 1000;
procedure OpenMap;
var
llInit: Boolean;
lInt: Integer;
begin
HMapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, MAPFILESIZE,
pchar('ИМЯ ОБЛАСТИ ОТОБРАЖЕНИЯ'));
// Проверка наличия
llInit := (GetLastError() <> ERROR_ALREADY_EXISTS);
if (hMapping = 0) thenbegin
ShowMessage('Невозможно создать объект отображения файла');
Application.Terminate;
exit;
end;
PMapData := MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if PMapData = nilthenbegin
CloseHandle(HMapping);
ShowMessage('Невозможно отобразить блок памяти');
Application.Terminate;
exit;
end;
if (llInit) thenbegin// Если объект отображения создан, инициализируем блок символами #0
memset(PMapData, #0, MAPFILESIZE);
end;
end;
procedure CloseMap;
beginif PMapData <> nilthenbegin
UnMapViewOfFile(PMapData);
end;
if HMapping <> 0 thenbegin
CloseHandle(HMapping);
end;
end;
{ Таким образом любые два или более приложения или DLL могут получить указатели к
одному и тому же блоку памяти.В данном примере PMapData указывает на 1000 -
байтный буфер, инициализированный вначале символами #0.Однако существует одна
потенциальная проблема - синхронизация доступа к памяти.Решить эту проблему можно
с помощью мьютексов.Вот пример их использования:
Вызовите LockMap перед записью (и чтением?) объекта отображения файла.
Не забывайте после каждого обновления немедленно вызывать UnlockMap. }var
HMapMutex: THandle;
const
REQUEST_TIMEOUT = 1000;
function LockMap: Boolean;
begin
Result := true;
HMapMutex := CreateMutex(nil, false, pchar('ИМЯ ВАШЕГО МЬЮТЕКСА'));
if HMixMutex = 0 thenbegin
ShowMessage('Не могу создать мьютекс');
Result := false;
endelsebeginif WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT) = WAIT_FAILED thenbegin// время ожидания
ShowMessage('Невозможно заблокировать объект отображения файла');
Result := false;
end;
end;
end;
procedure UnlockMap;
begin
ReleaseMutex(HMixMutex);
CloseHandle(HMixMutex);
end;
Статья Общий доступ к памяти, распределенной DLL раздела Файловая система DLL и PlugIns может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.