Расшаренная DLLDelphi , Файловая система , 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, позволяет нескольким процессам делиться данными, маппированными в их память. Вот разбивка кода: Декларация библиотеки
Библиотека декларируется как Константы
Константа Глобальные переменные Две глобальные переменные декларируются:
Экспортируемые процедуры
Библиотека экспортирует три процедуры:
1. Входная точка DLL
Входная точка DLL декларируется как процедура Анализ кода
Код appears to be well-structured and easy to follow. However, there are a few potential issues:
1. Обработка ошибок: Код использует Альтернативное решение
Одной из альтернативных решений может быть использование более современного подхода к делению данных между процессами,such as using a named pipe or a shared memory segment created with the Описание примера динамической связки библиотеки (DLL) на языке Delphi, которая обеспечивает доступ к общей памяти между процессами. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: DLL и PlugIns ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |