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

Вниз

Вопрос по ДЛЛ   Найти похожие ветки 

 
-=Germe$=- ©   (2007-09-20 10:56) [0]

Как можно передать строку из ДЛЛ в основную программу?


 
clickmaker ©   (2007-09-20 11:16) [1]

1. uses ShareMem + String
2. параметр типа PChar


 
Инс ©   (2007-09-20 11:20) [2]


> 2. параметр типа PChar

В таком виде - не самый хороший совет.
http://delphimaster.net/view/2-1190197924/


 
DVM ©   (2007-09-20 11:22) [3]


> Как можно передать строку из ДЛЛ в основную программу?

Если dll не планируется использовать нигде, кроме как делфи, то смотри [1] пункт 1. Если же планируется, то наверное стоит делать так, как сделано в WinAPI, например:

Функция имеет параметры типа PChar и размер, когда в функцию передается nil, то она возвращает сколько байт она собирается вернуть, вызываем ее первый раз с nil, а потом сами выделяем память и передаем указатель функции, она заполняет строку данными.


 
DVM ©   (2007-09-20 11:24) [4]

главное, чтобы память выделялась и освобождалась в одном месте, в функции память выделять - плохо.


 
Сергей М. ©   (2007-09-20 11:40) [5]

http://delphimaster.net/view/2-1190197924/


 
clickmaker ©   (2007-09-20 11:46) [6]


> [4] DVM ©   (20.09.07 11:24)

да можно
если и экзе и длл используют системный менеджер памяти, то функция может сама выделить, с помощью LocalAlloc
А приложении освободит - LocalFree
Правда, это надо отметить в спеке на функцию.

Вариант "Функция имеет параметры типа PChar и размер, когда в функцию передается nil, то она возвращает сколько байт она собирается вернуть"

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


 
Инс ©   (2007-09-20 11:46) [7]


> Сергей М. ©   (20.09.07 11:40) [5]

Повторение - мать учения! :)


 
DVM ©   (2007-09-20 11:59) [8]


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

ну над этим моментом стоит подумать, я написал первое, что пришло в голову по аналогии с WinAPI. Просто я че-то не припомню функций API, которые сами бы выделяли память.


 
Инс ©   (2007-09-20 12:01) [9]


> Просто я че-то не припомню функций API, которые сами бы
> выделяли память.

А они есть :)


 
DVM ©   (2007-09-20 12:03) [10]

А вообще, опять же повторюсь, редко встречаются случаи, когда функция возвращает сильно произвольного размера строки, ну, например, часто предельная длина 255 или 65535 наконец. Ну вот и стоит ориентироваться на эту длину. Если буфер окажется достаточного размера пусть функция заполняет его и возвращает длину заполнения, если недостаточного размера пусть ошибку возвращает.


 
DVM ©   (2007-09-20 12:03) [11]


> А они есть :)

Может и есть. Пример?


 
Инс ©   (2007-09-20 12:03) [12]


> Пример?

ConvertSidToStringSid


 
DVM ©   (2007-09-20 12:12) [13]


> ConvertSidToStringSid

Действительно выделяет. Но скорее все таки это исключение из правила. Новая функция из Advapi32.dll.


 
Инс ©   (2007-09-20 12:15) [14]


> Но скорее все таки это исключение из правила.

Я так понял, это новая мода такая... Кстати, кто-нибудь может мне объяснить, почему MS в этой справке к этой "новой" функции пишет, что память нужно освобождать "старой" LocalFree, которую сами MS уже давно не рекомендуют использовать вообще.


 
clickmaker ©   (2007-09-20 12:17) [15]

ну если разброс уж очень большой (например, функция возвращает список файлов), то она сама и может выделить
Так, кстати работают функции Netapi32 - там специально обученная NetApiBufferFree есть



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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
2-1189763330
artem779
2007-09-14 13:48
2007.10.14
как изменить имя проекта ?


9-1161037863
wrl
2006-10-17 02:31
2007.10.14
Подскажите ссылочку на описание формата VRML *.wrl ?


1-1185883153
Егоров А.Н.
2007-07-31 15:59
2007.10.14
ToolBar


2-1190037815
F@T@L_Err0r
2007-09-17 18:03
2007.10.14
Регулятор громкости


2-1190014526
~ShamaN~
2007-09-17 11:35
2007.10.14
Странности с модальной формой