Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-98747
Andrew S
2003-06-26 18:39
2003.10.30
Палитра TBitmap


6-98757
TButton
2003-09-03 17:55
2003.10.30
ЛАН


3-98501
Данила
2003-10-09 13:18
2003.10.30
ProgressBar во время SQL запроса.


14-98858
Adder
2003-10-10 23:47
2003.10.30
Желтые штаны - 2 раза КУ!


8-98744
Dankin
2003-07-01 03:28
2003.10.30
Как побороть мерцание?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский