Главная страница
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.48 MB
Время: 0.008 c
1-66601
DenKop
2002-02-05 20:08
2002.02.21
Как отобрзить апостроф в переменной типа String


1-66628
saviola
2002-02-06 17:51
2002.02.21
Можно ли работать с файлом *.doc как с *.txt или как с типизированным?


7-66687
VIB_G
2001-10-18 18:34
2002.02.21
Поиогите пожалуйста


1-66509
serjant
2002-02-06 08:54
2002.02.21
полосы в QuickRep


1-66521
Nina
2002-02-06 10:46
2002.02.21
TForm