Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Общий доступ к области отображения файлов (Sharing Memory Mapped Files)... Проверьте нижеследующий код:
varHMapping: 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. } varHMapMutex: 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
;