Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Файловая система , DLL и PlugIns

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

Код, который вы предоставили, это приложение на Delphi, демонстрирующее использование памяти, общей для нескольких процессов или DLL с помощью файлов, картографированных в память (MMF). MMF служит буфером, позволяющим разным частям программы доступаться и модифицировать его.

Анализ кода:

  1. Процедура OpenMap:

    • Она создает новый MMF с указанным именем (pchar('ИМЯ ОБЛАСТИ ОТОБРАЖЕНИЯ')) с помощью CreateFileMapping.
    • Она проверяет, существует ли файл, вызывая GetLastError() и храня его возвращаемое значение в llInit. Если файл не существует, она устанавливает llInit в true.
    • Если HMapping равен 0 (то есть создание MMF не удалось), она отображает сообщение об ошибке, закрывает приложение и выходит.
    • Она картографирует MMF в память с помощью MapViewOfFile, храня ее адрес в PMapData. Если это не удается, она закрывает handle и отображает сообщение об ошибке.
  2. Процедура CloseMap:

    • Она размапивает регион памяти из текущего процесса с помощью UnMapViewOfFile.
    • Она закрывает handle к MMF с помощью CloseHandle.
  3. Основная проблема с этим кодом заключается в отсутствии механизма синхронизации для обеспечения безопасного доступа к общей области памяти. Это может привести к коррупции данных или неожиданному поведению.

  4. Для решения этой проблемы вам нужно добавить мьютекс (блокировку) перед доступом к общей памяти и освободить ее, когда вы закончите. Вы уже предоставили пример использования LockMap и UnlockMap процедур.

  5. Процедура LockMap:

    • Она создает новый мьютекс с помощью CreateMutex, храня его handle в HMapMutex.
    • Если создание не удается, она отображает сообщение об ошибке и возвращает false.
    • Она ожидает, пока мьютекс не станет доступным, используя WaitForSingleObject с таймаутом REQUEST_ETIMEOUT миллисекунд. Если это время вышло или операция не удалась, она отображает сообщение об ошибке и возвращает false.
  6. Процедура UnlockMap:

    • Она освобождает мьютекс с помощью ReleaseMutex.
    • Она закрывает handle к мьютексу с помощью CloseHandle.

Обзор статьи: Обсуждается вопрос общего доступа к памяти, распределенной между несколькими приложениями или DLL, и предлагается использование мьютексов для синхронизации доступа к этой памяти.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-09 16:17:03/0.0035800933837891/0