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

Вниз

Разделение   Найти похожие ветки 

 
mio ©   (2003-10-28 18:12) [0]

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

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

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

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


 
MBo ©   (2003-10-28 18:32) [1]

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


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

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

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

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

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


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

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


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

> N169 (28.10.03 19:27) [3]

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


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

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


 
y-soft ©   (2003-10-29 07:19) [6]

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

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


 
mio ©   (2003-10-29 12:12) [7]

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

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

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

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


 
MBo ©   (2003-10-29 12:20) [8]

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


 
mio ©   (2003-10-29 12:28) [9]

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


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

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


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

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

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


 
Reindeer Moss Eater ©   (2003-10-29 13:17) [12]

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

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


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

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

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


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

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

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
1-75199
denmin
2003-12-11 10:36
2003.12.23
Как вывести Memo в QuickRep?


14-75323
Думкин
2003-12-01 06:38
2003.12.23
С днем рождения! 1 декабря.


6-75298
ChayNik
2003-10-27 04:17
2003.12.23
Помогите Чайнику


7-75415
Ivolg
2003-10-17 11:50
2003.12.23
Запуск на старте Windows


14-75382
alex134
2003-11-28 00:21
2003.12.23
Вопрос по Вебдизайну, авось кто знает?