Общий доступ к памяти, распределенной DLL

Советы » DLL » Общий доступ к памяти, распределенной DLL

Общий доступ к области отображения файлов (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) then

begin

ShowMessage('Невозможно создать объект отображения файла'); Application.Terminate; exit; end

; PMapData := MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if

PMapData = nil

then

begin

CloseHandle(HMapping); ShowMessage('Невозможно отобразить блок памяти'); Application.Terminate; exit; end

; if

(llInit) then

begin

// Если объект отображения создан, инициализируем блок символами #0 memset(PMapData, #0, MAPFILESIZE); end

; end

; procedure

CloseMap; begin

if

PMapData <> nil

then

begin

UnMapViewOfFile(PMapData); end

; if

HMapping <> 0 then

begin

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 then

begin

ShowMessage('Не могу создать мьютекс'); Result := false

; end

else

begin

if

WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT) = WAIT_FAILED then

begin

// время ожидания ShowMessage('Невозможно заблокировать объект отображения файла'); Result := false

; end

; end

; end

; procedure

UnlockMap; begin

ReleaseMutex(HMixMutex); CloseHandle(HMixMutex); end

;

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com