Форум: "Основная";
Поиск по всему сайту: 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.026 c
1-66596           Georg                 2002-02-04 18:31  2002.02.21  
TrackBar


3-66493           kam_nal               2002-01-29 17:54  2002.02.21  
Password при подключении к базе


3-66447           DeNNiss               2002-01-28 10:34  2002.02.21  
Передача данных в Excel


1-66539           SireX                 2002-02-04 16:17  2002.02.21  
Проблема со скачиванием файлов


3-66439           Beginer               2002-01-28 07:51  2002.02.21  
SQL2000 и ADO