Общий доступ к области отображения файлов (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 beginShowMessage('Невозможно создать объект отображения файла');Application.Terminate;exit;end;PMapData := MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);if PMapData = nil then beginCloseHandle(HMapping);ShowMessage('Невозможно отобразить блок памяти');Application.Terminate;exit;end;if (llInit) then begin// Если объект отображения создан, инициализируем блок символами #0memset(PMapData, #0, MAPFILESIZE);end;end; procedure CloseMap; begin if PMapData <> nil then beginUnMapViewOfFile(PMapData);end;if HMapping <> 0 then beginCloseHandle(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 beginShowMessage('Не могу создать мьютекс');Result := false;end else beginif WaitForSingleObject(HMapMutex,REQUEST_TIMEOUT) = WAIT_FAILED then begin// время ожиданияShowMessage('Невозможно заблокировать объект отображения файла');Result := false;end;end;end; procedure UnlockMap; begin ReleaseMutex(HMixMutex);CloseHandle(HMixMutex);end; |
[000272]