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

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

Память и DLL


Tosov ©   (2002-02-05 23:41:00) 

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


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

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

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

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


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

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


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

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

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


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

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


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

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


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

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


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

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

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

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

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


Наверх

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