Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разделение


mio ©   (2003-10-28 18:12:00) 

Дано: программа на Delphi цепляет DLL, написанную на C/C++.
"Главная" программа вызывает из DLL некую функцию, которая выделяет динамическую память в "куче", чем-то там ее заполняет и возвращает указатель вызывающей программе. Вызывающая программа должна эту память освободить.
Найти: методы работы с "кучей" через Win32 API (или еще как) для реализации такого фокуса.

Насколько я понимаю, удовлетворило бы решение с LocalAlloc/LocalFree, но напрягает то, что в MSDN функции LocalXXX приговорены: "устаревшие!".

Если Мастера подскажут, как решить такую задачку, равно как объяснят, чем может грозить использование LocalXXX, буду крайне признателен.

С вариантами типа "переписать все на Delphi" прошу не беспокоить :-)


Владислав   (2003-10-29 14:16:00) [1]

> mio © (29.10.03 13:57) [13]

Вам это покажется странным. Работал.

Слава богу это не та проблема, которая в корне нарушает положения ТЗ. Просто нужно быть более гибким. Я понимаю, если dll написана 20 лет назад, исходники утеряны, а творит она чудеса, написать которые просто нет времени...


mio   (2003-10-29 13:57:00) [2]

> Владислав © (29.10.03 13:10) [11]
Вы, сударь, видимо никогда не работали на наше Государство, да еще по заранее утвержденным ТЗ.

N169 и Reindeer Moss Eater спасибо за высказанные соображения.
Для себя полагаю тему исчерпанной и закрытой.
Если кто хочет рассказать мне, как я не прав -
mailto: o_ibrajev@mail.ru


Reindeer Moss Eater   (2003-10-29 13:17:00) [3]

Подход конечно имеет право на жизнь, но что если программист - преемник программиста распределяющего память подумает:

"а не передать ли мне указатель скажем на локальную переменную вместо того, чтобы динамически выделять память?"


Владислав   (2003-10-29 13:10:00) [4]

> mio © (29.10.03 12:28) [9]

Ну если он пишет ее в соседней комнате, то пусть добавит эти самы функции освобождения памяти. Тебе же уже дали эти советы. Куда уж проще.


N169   (2003-10-29 12:31:00) [5]

Дескриптор кучи не обязательно передавать, можно использовать кучку процесса: HeapAlloc(GetProcessHeap(),.....


mio   (2003-10-29 12:28:00) [6]

> MBo © (29.10.03 12:20) [8]
Мое вам sorry по поводу некорректной постановки задачи.
Упомянутую DLL пишет в настоящий момент коллега в соседней комнате, и КАК он ее напишет - это еще большой вопрос. Идиотизм ситуации в том, что согласно ТЗ все должно происходить именно так, как описано в исходном сообщении, и никаких "лишних" данных передавать нежелательно (в т.ч. дескриптор кучи).
Правка ТЗ - дело хреновое, и я пойду ругаться с шефом только если народ (в лице Мастеров) окончательно решит, что случай безнадежный :-)


MBo   (2003-10-29 12:20:00) [7]

>от этой идеи отмахнулись?
Потому что из твоего вопроса не следует явно, что память выделяется в DLL именно HeapAlloc - а в таком случае тебе для использования HeapFree нужно знать еще и дескриптор кучи.


mio   (2003-10-29 12:12:00) [8]

> MBo © (28.10.03 18:32) [1]
> Освобождать память следует обычно там же, где ее выделяли,
> причем комплементарным методом. Если в Dll есть функция
> выделения, то в ней же должна быть и функция освобождения
Господа! Я же четко сформулировал вопрос: память должна выделяться в одном месте и средствами одного языка, а освобождаться - в другом и средствами другого.

То же касается заметки от
> Владислав © (28.10.03 19:13) [2]

Почему так? ТЗ, мать его...

> N169 (28.10.03 19:27) [3]
Спасибо Вам за идею с HeapAlloc. Вопрос лишь в том, почему прочие Мастера от этой идеи отмахнулись?


y-soft   (2003-10-29 07:19:00) [9]

Часто встречается ситуация, когда в Dll, с которой непосредственно работает приложение, функция освобождения памяти напрочь отстутствует. Так происходит, например, при написании UDF для InterBase, когда UDF объявляется с директивой FREE IT. Понятно, что в этом случае и Dll, и приложение для манипуляций с памятью обращаются к какой-то 3-й Dll, в которой комплиментарные функции для выделения/освобождения памяти есть...

Так что действительно - надо рассматривать каждый конкретный случай...


Игорь Шевченко   (2003-10-28 20:50:00) [10]

Поискать в DLL функцию освобождения - так будет проще всего. Иначе без детальной информации совет дать трудно.


Владислав   (2003-10-28 19:29:00) [11]

> N169 (28.10.03 19:27) [3]

Все так просто?..


N169   (2003-10-28 19:27:00) [12]

Вместо LocalAlloc / GlobalAlloc использовать HeapAlloc(), вот и все дела.


Владислав   (2003-10-28 19:13:00) [13]

Я бы использовал один из двух вариантов.
Первый. Выделяешь память в главной программе, dll эту память заполняет нужными данными, используешь данные, когда они не нужны, высвобождаешь соответствующим выделению методом.

Второй. Dll экспортирует функции выделения и освобождения памяти (выделение может быть и "косвенным"). Твоя задача вызвать функцию освобождения, когда данные больше не нужны.

Есть и другие варианты, но они ставят во взаимную зависимость главную программу и библиотеку. Поэтому мне они очень не нравяться.

А поскольку "твоя библиотека не твоя", тебе просто необходимо пользоваться соответствующим способу выделения освобождением. Так что читай доку к библиотеке.


MBo   (2003-10-28 18:32:00) [14]

Освобождать память следует обычно там же, где ее выделяли, причем комплементарным методом. Если в Dll есть функция выделения, то в ней же должна быть и функция освобождения


Наверх

Титульная страница Поиск, карта сайта Написать письмо