Главная страница
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.06 c
1-98566
DreadAngel
2003-10-19 14:32
2003.10.30
Проблема с печатью!!!!


8-98746
maksyaha
2003-06-25 00:14
2003.10.30
Как можно сделать форму полупрозрачной и возможно ли это вообще?


1-98643
DellAx
2003-10-17 12:26
2003.10.30
Как сделать чтоб TPanel имела другую форму типа многоугольника???


14-98861
ИМХО
2003-10-10 12:28
2003.10.30
ZX Spectrum


14-98827
Ваше имя ;)
2003-10-10 08:57
2003.10.30
Беспредел