Советы по Delphi

         

Общий доступ к памяти, распределенной 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;

[000272]



Содержание раздела