Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Вниз

Память и DLL 


Tosov   (2002-02-05 23:41) [0]

Обьясните пожалуйста поподробнее как работать с памятью при использовании DLL и PChar
Например функция func в DLL получает строку (PChar), переводит ее в число, умножает на 11 и возвращает текст обратно.
Интересует именно не реализация умножения, а выделение/освобождение памяти - кто (DLL или программа) и где должен этим заниматься?



Suntechnic   (2002-02-06 00:21) [1]

При работе с паматью в Dll используй одно правило: Где память выделялась там её и освобождай. И никогда проблем с памятью в Dll не будет. Т.е. в твоём конкретном случае возможно 2 варианта:

1) Передать указатель в Dll, разместить там память под строку. Скопировать туда строку и вернуть указатель назад. Но тогда для освобождения тоже придётся передать указатель в Dll и уже там память освобождать.

2) Выделить память в основном модуле. Передать указатель на неё в Dll, и скопировать туда строку. Освобождать строку тоже естественно в основном модуле.

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



lel   (2002-02-06 00:23) [2]

Твоя программа должна обеспечить достаточно памяти, чтобы туда уместился результат операции (если DLL его пишет в туже переменную), а для внутренних операций, пусть сама DLL выделаяет/освобождает память.



Tosov   (2002-02-06 00:29) [3]

Я выделяю память под свою строку "11" = 2 байта
Передаю этот PChar (указатель) в DLL.Но размер строки в результате работы будет больше (11*11="121" -3байта), чем память под нее +DLL наверняка не знает размер этой памяти.Что делать в этом случае?



Tosov   (2002-02-06 00:31) [4]

lel
А если я не знаю каков будет результат?



Suntechnic   (2002-02-06 00:35) [5]

>Tosov © (06.02.02 00:29)
>Я выделяю память под свою строку "11" = 2 байта
>Передаю этот PChar (указатель) в DLL.Но размер строки в результате работы будет больше (11*11="121" -3байта), чем память под нее +DLL >наверняка не знает размер этой памяти.Что делать в этом случае?

Ответ напрашивается сам собой. Ты вместо одной, пишешь 2 функции, одна из которых возвращает необходимый для операции размер памяти(так сказать оценочная ф-ция). Так это всегда и делалось и велосипед изобретать здесь право не стоит...



Tosov   (2002-02-06 16:30) [6]

> Ответ напрашивается сам собой
А если я не знаю, что вернет эта функция и она сама это не знает до своего исполнения. А ответ напрашивается другой - память выделяется в DLL (причем указатель надо не менять) и удаляется в программе.Но, При работе с паматью в Dll используй одно правило: Где память выделялась там её и освобождай вроде верное правило. А как с этим в системных DLL"ках и как увеличить размер памяти, выделенной GetMem"ом.



Suntechnic   (2002-02-06 17:40) [7]

...я что-то вообще твою логическую цепочку потерял. Ты толком объяснить можешь?

>А если я не знаю, что вернет эта функция и она сама это не знает до своего исполнения

Да откуда я знаю логику твоего приложения и логику твоей ф-ции? Ты спросил про принципы, я про них ответил и высказал замечания по поводу стиля программирования. А ты конечно волен поступать как тебе захочется.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.015 c
1-66517           irq                   2002-02-06 18:50  2002.02.21  
Еще раз про календарь


4-66714           Merder                2001-12-22 18:37  2002.02.21  
Видео


1-66561           maks_f                2002-02-05 14:40  2002.02.21  
Как получить процедуру из DLL


1-66545           VovanV                2002-02-03 23:55  2002.02.21  
Множество настроек - как организовать?


1-66613           Геральт               2002-02-03 21:18  2002.02.21  
Run-time создание компонент