![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по ДЛЛ [D7, Win2k, WinXP]
-=Germe$=- © (2007-09-20 10:56:00)Как можно передать строку из ДЛЛ в основную программу?
clickmaker (2007-09-20 12:17:00) [1]ну если разброс уж очень большой (например, функция возвращает список файлов), то она сама и может выделить
Так, кстати работают функции Netapi32 - там специально обученная NetApiBufferFree есть
Инс (2007-09-20 12:15:00) [2]
> Но скорее все таки это исключение из правила.
Я так понял, это новая мода такая... Кстати, кто-нибудь может мне объяснить, почему MS в этой справке к этой "новой" функции пишет, что память нужно освобождать "старой" LocalFree, которую сами MS уже давно не рекомендуют использовать вообще.
DVM (2007-09-20 12:12:00) [3]
> ConvertSidToStringSid
Действительно выделяет. Но скорее все таки это исключение из правила. Новая функция из Advapi32.dll.
DVM (2007-09-20 12:03:00) [4]А вообще, опять же повторюсь, редко встречаются случаи, когда функция возвращает сильно произвольного размера строки, ну, например, часто предельная длина 255 или 65535 наконец. Ну вот и стоит ориентироваться на эту длину. Если буфер окажется достаточного размера пусть функция заполняет его и возвращает длину заполнения, если недостаточного размера пусть ошибку возвращает.
DVM (2007-09-20 12:03:00) [5]
> А они есть :)
Может и есть. Пример?
Инс (2007-09-20 12:03:00) [6]
> Пример?
ConvertSidToStringSid
Инс (2007-09-20 12:01:00) [7]
> Просто я че-то не припомню функций API, которые сами бы
> выделяли память.
А они есть :)
DVM (2007-09-20 11:59:00) [8]
> не всегда подходит, если функция какие-то сложные специфические
> вычисления делает. Как быть? Двойная работа?
ну над этим моментом стоит подумать, я написал первое, что пришло в голову по аналогии с WinAPI. Просто я че-то не припомню функций API, которые сами бы выделяли память.
clickmaker (2007-09-20 11:46:00) [9]
> [4] DVM © (20.09.07 11:24)
да можно
если и экзе и длл используют системный менеджер памяти, то функция может сама выделить, с помощью LocalAlloc
А приложении освободит - LocalFree
Правда, это надо отметить в спеке на функцию.
Вариант "Функция имеет параметры типа PChar и размер, когда в функцию передается nil, то она возвращает сколько байт она собирается вернуть"
не всегда подходит, если функция какие-то сложные специфические вычисления делает. Как быть? Двойная работа? Хранить в статической переменной до следующего вызова? А если допустим другой поток ломанется?
Инс (2007-09-20 11:46:00) [10]
> Сергей М. © (20.09.07 11:40) [5]
Повторение - мать учения! :)
Сергей М. (2007-09-20 11:40:00) [11]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190197924&n=18
DVM (2007-09-20 11:24:00) [12]главное, чтобы память выделялась и освобождалась в одном месте, в функции память выделять - плохо.
DVM (2007-09-20 11:22:00) [13]
> Как можно передать строку из ДЛЛ в основную программу?
Если dll не планируется использовать нигде, кроме как делфи, то смотри [1] пункт 1. Если же планируется, то наверное стоит делать так, как сделано в WinAPI, например:
Функция имеет параметры типа PChar и размер, когда в функцию передается nil, то она возвращает сколько байт она собирается вернуть, вызываем ее первый раз с nil, а потом сами выделяем память и передаем указатель функции, она заполняет строку данными.
Инс (2007-09-20 11:20:00) [14]
> 2. параметр типа PChar
В таком виде - не самый хороший совет.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190197924&n=18
clickmaker (2007-09-20 11:16:00) [15]1. uses ShareMem + String
2. параметр типа PChar