Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.21;
Скачать: CL | DM;

Вниз

Память и 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]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.02.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
4-66708
Tor
2001-12-22 13:33
2002.02.21
Процесс


7-66698
gggg
2001-11-17 15:33
2002.02.21
Help. Люди, кто знает как узнать, что Win ды хотят выгрузиться


1-66507
VMR
2002-02-04 16:53
2002.02.21
Отладка: Data Breakpoint


14-66678
Nikolay
2002-01-01 17:44
2002.02.21
Всех с наступившим!


1-66584
AZ
2002-02-04 07:22
2002.02.21
Связка по Event