Приветствую Вас Гость | RSS

Меню сайта

Реклама

Категории раздела
CD-ROM [11]
DLL и PlugIns [75]
Help файлы [20]
INI файлы [16]
RS232 [2]
Активные директории [1]
Директории [0]
Диски [0]
Корзина [5]
Порты [26]
Ресурсы [0]
Файлы [0]
Форматы файлов [15]
Ярлыки [0]

Наш опрос
Оцените мой сайт
Всего ответов: 30

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Файловая система » 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;
Категория: DLL и PlugIns | Добавил: Skinner (06.07.2008)
Просмотров: 331 | Рейтинг: 0.0/0
  Delphi Lab   Главная   Регистрация   Вход  
Интересная Цитата

Поиск

Магазин


Copyright MyCorp © 2025 Хостинг от uCoz