Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизТеоретический вопрос о ShareMem: нельзя ли обойтись? Найти похожие ветки
← →
PVOzerski (2003-10-16 17:54) [0]Сейчас, читая другую ветку, задумался: а так ли нужен ShareMem? А если через callback-функцию при загрузке передать DLL-и Memory Manager от вызывающего приложения?
← →
Игорь Шевченко (2003-10-16 17:59) [1]Если бы это решало проблему, Borland бы не писал ShareMem
← →
han_malign (2003-10-16 18:11) [2]> а так ли нужен ShareMem?
- а так ли нужны стринговые переменные параметры и результаты функций, в DLL?
← →
pasha_golub (2003-10-16 18:12) [3]Ну в принципе насколько я понял, ShareMem - это юнит-оболочка для borlndmm.dll, значит наверно мона как-то извратиться. А зачем?
← →
pasha_golub (2003-10-16 18:13) [4]2han_malign
А динамические массивы нужны? Я думаю да
← →
PVOzerski (2003-10-16 18:19) [5]Практически - не работает :^( ...
← →
Romkin (2003-10-16 18:22) [6]Угу. А практически лучше пользовать AxtiveX lib, при раннем связывании работает так же быстро, и никаких проблем с памятью...
← →
icWasya (2003-10-16 18:24) [7]
>
> PVOzerski © (16.10.03 17:54)
> Сейчас, читая другую ветку, задумался: а так ли нужен ShareMem?
> А если через callback-функцию при загрузке передать DLL-и
> Memory Manager от вызывающего приложения?
Так ShareMem только это и делает
← →
Nikolay M. (2003-10-16 18:27) [8]Тоже ради интереса посмотрел. Имхо, без ShareMem обойтись можно (если перекинуть инициализацию менеджера памяти в файл проекта?), а вот можно ли обойтись без borlndmm.dll - это уже другой вопрос...
← →
Fantasist (2003-10-16 20:46) [9]
> Сейчас, читая другую ветку, задумался: а так ли нужен ShareMem?
> А если через callback-функцию при загрузке передать DLL-и
> Memory Manager от вызывающего приложения?
Так можно сделать, если в dll-ке не использовать в uses юниты, которые проводят инициализацию с выделением памяти. То есть нужно исключить использование старого менеджера памяти в длл, пока вы не заменили его новым. Если подключить, например, SysUtils, то уже будут обломы. Если же первым стоит sharemem, то он в секции инициализации проводит замену менеджера памяти раньше, чем он успевает быть использован.
← →
B.B.Gone (2003-10-16 21:56) [10]Видел где-то unit FastShareMem, вроде позволяет обойтись без borlndmm.dll
← →
Fantasist (2003-10-17 00:09) [11]
> а вот можно ли обойтись без borlndmm.dll - это уже другой
> вопрос...
Чисто ради теории пол дня угрохал на эксперементы. Написал вот такой юнит:
unit Unit2;
interface
function CreateFileMapping(hFile: THandle; lpFileMappingAttributes: Pointer;
flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: Cardinal; lpName: PChar): THandle; stdcall;
function MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess: Cardinal;
dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap: Cardinal): Pointer; stdcall;
function UnmapViewOfFile(lpBaseAddress: Pointer): Longbool; stdcall;
function CloseHandle(hObject: THandle): Longbool; stdcall;
implementation
var
hFileMap,err:THandle;
pMemManager:PMemoryManager;
function CreateFileMapping; external "kernel32.dll" name "CreateFileMappingA";
function MapViewOfFile; external "kernel32.dll" name "MapViewOfFile";
function UnmapViewOfFile; external "kernel32.dll" name "UnmapViewOfFile";
function CloseHandle; external "kernel32.dll" name "CloseHandle";
initialization
hFileMap := CreateFileMapping(Longword(-1), nil, 4 {PAGE_READWRITE}, 0, 124, "MyMemManager");
err:= GetLastError;
if err = 183 {ERROR_ALREADY_EXISTS} then
begin
pMemManager := MapViewOfFile(hFileMap, 4 {FILE_MAP_READ}, 0, 0, 0);
SetMemoryManager(pMemManager^);
end
else
begin
pMemManager :=MapViewOfFile(hFileMap, 2 {FILE_MAP_WRITE}, 0, 0, 0);
GetMemoryManager(pMemManager^);
end;
UnmapViewOfFile(pMemManager);
end.
И вставил этот юнит первым в секции uses в exe-шник и в dll-ку. В длл-ке вызывается только одна функция:
function Proc(s:string):string;
var
s1:string;
begin
s1:=s;
s1:=copy(s1,2,3);
Result:=s+" - "+s1;
end;
Ситуация такая. Если dll"ку подгружать динамически, то проблем никаких не возникает (если не забывать FreeLibrary вызвать). Если же делать статическую привязку у функциям из длл-ки, то работает, пока процесс не завершается - тут то в секциях финализации начинаются проблемы. То есть пока библиотека работает при живом процессе - все путем, но стоит ей только маленько задержаться загруженной, как все обламывается. Если я сделал правильные выводы из эксперементов.
Почему?
← →
Amoeba (2003-10-17 16:53) [12]Да, если использовать unit FastShareMem borlndmm.dll уже не потребуется.
http://www.codexterity.com/fastsharemem.htm
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c