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

Вниз

Замена менеджера памяти.   Найти похожие ветки 

 
Alxd   (2003-02-18 21:37) [0]

Есть две DLL написанные на Delphi, подключаемые к стороннему приложению. При их работе активно используются динамические массивы, которыми они могут обмениваются. Соответственно возникает проблема, что данные в разных кучах. Как известно, работа с кучей осуществляется через Memory Manager Delphi.
Подменяю адреса ф-ий GetMem, FreeMem и ReallocMem в менеджере на адреса ф-ий работы с памятью самого приложения. Во время отладки все ок, но как только доходит до первого вызова ReallocMem вылазит Access Violation и все. Финиш. В использовании ShareMem отказано, нужно другое решение. Прошу теоретической помощи.


 
Романов Р.В. ©   (2003-02-18 21:52) [1]

Мобыть вместо всего этого проще использовать FileMapping


 
Alex Konshin ©   (2003-02-19 06:43) [2]

Я так и не понял, что ты делаешь. Ты SetMemoryManager используешь?


 
vedmed ©   (2003-02-19 09:29) [3]

Посмотри
http://www.codexterity.com/fastsharemem.htm
может подойдет


 
REA ©   (2003-02-19 10:04) [4]

DLL отображается в адресное пространство процесса. Если построить обмен таким образом, что тот кто выделяет память ее освобождает, то коллизий не должно быть. Как вариант использовать не динамические массивы, а API функции выделения памяти. Можно еще передать из EXE указатель на свой "менеджер памяти" - функции работы с памятью.


 
icWasya ©   (2003-02-19 10:22) [5]

специально для таких случаев у борланда есть borlndmm.dll
используется так:

во всех проектах , то есть во всех DLL и EXE первым юнитом ставится ShareMem

Program ABCD;
uses
ShareMem,
Forms,
.....



Library A;
uses
ShareMem,
.....


Library B;
uses
ShareMem,
.....


Далее в каталог с EXE и DLL помещается borlndmm.dll.

Должно всё работать.


 
Alxd   (2003-02-19 17:58) [6]

Alex Konshin - конечно SetMemoryManager.
vedmed - спасибо. уже смотрю. но хочется ведь использовать менеджер памяти самого приложения, если оно дает доступ к таким функциям.
REA - все верно. вот только передавать указатель на заранее распределенную память для SetLength не очень удобно, вот и изощряюсь.
icWasya - я написал, что приложение стороннее и sharemem не использовать.
Николай Банников прислал ответ по почте и предложил подменить функции в initialization и finalisation. Вот этого я не пробовал!

Всем спасибо.


 
icWasya ©   (2003-02-19 20:08) [7]

А как ты хочешь достучаться до менеджера памяти самого приложения, если приложение не твоё??


 
Alxd   (2003-02-20 05:32) [8]

Приложение предоставляет такие функции. Экспортирует. А мои DLL соответственно могут их импортировать.



Страницы: 1 вся ветка

Текущий архив: 2003.03.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
1-5649
avch
2003-02-20 15:05
2003.03.03
Создание компонента


14-5728
MAN-In-RED
2003-02-13 23:57
2003.03.03
Как максимально увеличить скорость кода?


3-5441
VovikA
2003-02-13 13:07
2003.03.03
Как прочитать и откатить транзакцию в MS Sql 200


3-5404
Andrio
2003-02-12 14:20
2003.03.03
IB не хочет выполнять генераторы???


3-5465
Niki
2003-02-12 14:19
2003.03.03
Как поместить графическое изображение в TDBGrid ?