Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
ВнизРазделение Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c