Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
14-75398
Бухгалтер
2003-11-28 10:37
2003.12.23
Глюк с клавой


14-75388
SPeller
2003-11-28 15:07
2003.12.23
Помогите с MSDN


4-75450
Sfagnum
2003-10-23 12:04
2003.12.23
Значение SES_EMULATESYSEDIT


1-75173
Daka
2003-12-11 19:25
2003.12.23
MS Word and MS Excel who i can create a document !


1-75154
Alex-chainik
2003-12-10 14:41
2003.12.23
Две формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский