Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.30;
Скачать: CL | DM;

Вниз

Теоретический вопрос о 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
4-98943
Slym
2003-08-27 09:39
2003.10.30
Визуальный строитель диалогов...


9-98420
Gayrus
2003-03-24 04:43
2003.10.30
Software рендеринг


3-98522
Nummer
2003-10-09 03:12
2003.10.30
допотопный SQL..


6-98766
arous
2003-09-05 01:03
2003.10.30
FTP


3-98488
sokoloff
2003-10-09 17:00
2003.10.30
как получить количество измененных записей при update в IB