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

Расшаренная DLL

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



Автор: Xavier Pacheco

{
Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira
}

library ShareLib;

uses
  ShareMem,
  Windows,
  SysUtils,
  Classes;
const

  cMMFileName: PChar = 'SharedMapData';

{$I DLLDATA.INC}

var
  GlobalData: PGlobalDLLData;
  MapHandle: THandle;

  { GetDLLData will be the exported DLL function }

procedure GetDLLData(var AGlobalData: PGlobalDLLData); stdcall;
begin
  { Point AGlobalData to the same memory address referred to by GlobalData. }
  AGlobalData := GlobalData;
end;

procedure OpenSharedData;
var
  Size: Integer;
begin
  { Get the size of the data to be mapped. }
  Size := SizeOf(TGlobalDLLData);

  { Now get a memory-mapped file object. Note the first parameter passes
    the value $FFFFFFFF or DWord(-1) so that space is allocated from the system's
    paging file. This requires that a name for the memory-mapped
    object get passed as the last parameter. }

  MapHandle := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, Size,
    cMMFileName);

  if MapHandle = 0 then
    RaiseLastWin32Error;
  { Now map the data to the calling process's address space and get a
    pointer to the beginning of this address }
  GlobalData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
  { Initialize this data }
  GlobalData^.S := 'ShareLib';
  GlobalData^.I := 1;
  if GlobalData = nil then
  begin
    CloseHandle(MapHandle);
    RaiseLastWin32Error;
  end;
end;

procedure CloseSharedData;
{ This procedure un-maps the memory-mapped file and releases the memory-mapped
  file handle }
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MapHandle);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: OpenSharedData;
    DLL_PROCESS_DETACH: CloseSharedData;
  end;
end;

exports
  GetDLLData;

begin
  { First, assign the procedure to the DLLProc variable }
  DllProc := @DLLEntryPoint;
  { Now invoke the procedure to reflect that the DLL is attaching
    to the process }
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Скачать весь проект

Программная библиотека (DLL), написанная на языке Delphi, позволяет нескольким процессам делиться данными, маппированными в их память. Вот разбивка кода:

Декларация библиотеки Библиотека декларируется как ShareLib и использует несколько других библиотек: ShareMem, Windows, SysUtils и Classes.

Константы Константа cMMFileName определяет имя файла, используемого для хранения разделяемых данных.

Глобальные переменные Две глобальные переменные декларируются:

  • GlobalData: указатель на структуру PGlobalDLLData, представляющую разделяемые данные.
  • MapHandle:.handle к файлу памяти.

Экспортируемые процедуры Библиотека экспортирует три процедуры: 1. GetDLLData: принимает указатель на структуру PGlobalDLLData в качестве входного параметра и возвращает тот же результат, что и GlobalData. Это позволяет другим процессам доступаться к разделяемым данным. 2. OpenSharedData: открывает файл памяти, маппированный в адресное пространство вызывающего процесса, и инициализирует разделяемые данные. 3. CloseSharedData: размапивает файл памяти и освобождает handle.

Входная точка DLL Входная точка DLL декларируется как процедура DLLEntryPoint. Эта процедура вызывается операционной системой при загрузке или разгрузке DLL. Она использует case-заявление для определения, является ли DLL привязанной (DLL_PROCESS_ATTACH) или отсоединенной (DLL_PROCESS_DETACH) от процесса.

Анализ кода Код appears to be well-structured and easy to follow. However, there are a few potential issues: 1. Обработка ошибок: Код использует RaiseLastWin32Error для поднятия исключения, если файл памяти не может быть создан или маппирован. Это хорошая практика, но было бы лучше поймать конкретные коды ошибки и обработать их более явно. 2. Управление ресурсами: Код не закрывает handle файла памяти явно при разгрузке DLL (DLL_PROCESS_DETACH). Возможно, это может вызвать проблемы, если несколько процессов делятся одной и той же DLL. 3. Инициализация данных: Код инициализирует разделяемые данные, установив GlobalData^.S и GlobalData^.I. Однако не ясно, должны ли эти значения быть изменены другими процессами или оставаться постоянными.

Альтернативное решение Одной из альтернативных решений может быть использование более современного подхода к делению данных между процессами,such as using a named pipe or a shared memory segment created with the CreateFile function. Это могло бы предоставить больше гибкости и лучше обработку ошибок, чем традиционный подход с использованием файла памяти, используемого в этом коде.

Описание примера динамической связки библиотеки (DLL) на языке Delphi, которая обеспечивает доступ к общей памяти между процессами.


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

Получайте свежие новости и обновления по 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-01-29 02:56:46/0.0099339485168457/0