Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизКак правильнее передавать строки в DLL? Найти похожие ветки
← →
Razor (2005-11-14 05:48) [0]...произвольной длины, туда и обратно? С учетом того, что и длл и программа могут быть, и могут и не быть на дельфи?
Стоит ли использовать дельфовый менеджер памяти, или лучше брать память из хеапа, например?
Ответ интересует с точек зрения беспроблемности работы, и быстродействия.
Заранее спасибо.
← →
MBo © (2005-11-14 07:09) [1]>С учетом того ..
придется отказаться от дельфийских длинных строки и использовать PChar
← →
Leonid Troyanovsky © (2005-11-14 08:31) [2]
> MBo © (14.11.05 07:09) [1]
> придется отказаться от дельфийских длинных строки и использовать
> PChar
Или WideString.
--
Regards, LVT.
← →
Razor (2005-11-14 13:15) [3]
> придется отказаться от дельфийских длинных строки и использовать
> PChar
> Или WideString.
Это понятно! Так и подразумевалось!
Вопрос в другом - как выделять память?
Через allocmem или getmem или allocheap или ...?
В одной программе я вообще увидел вариант передачи строк просто через pchar и strpas, без выделения памяти....
← →
Leonid Troyanovsky © (2005-11-14 13:55) [4]
> Razor (14.11.05 13:15) [3]
> > придется отказаться от дельфийских длинных строки и использовать
> > PChar
> > Или WideString.
> Вопрос в другом - как выделять память?
В первом случае память обычно выделяет вызывающее dll приложение.
Т.е., передается адрес распределенного буфера и его размер.
Во втором - это как сумеет то самое приложение, что-нибудь типа
SysAllocStringLen. В дельфи оно делается само.
--
Regards, LVT.
← →
Digitman © (2005-11-14 13:58) [5]
> Razor
а лучшим решением будет оформление своего алгоритма в виде ole-сервера автоматизации
в этом случае головная боль с memory management сразу пропадает - всю черную работу берет на себя ОС
← →
Razor (2005-11-14 16:46) [6]Надо мне учится лучше мысли формулировать....
> а лучшим решением будет оформление своего алгоритма в виде
> ole-сервера автоматизации
Это будет "из пушки по воробьям", если мне нужно парой строчек обмениваться....ИМХО.
> В первом случае память обычно выделяет вызывающее dll приложение.
>
> Т.е., передается адрес распределенного буфера и его размер.
>
Я прекрасно понимаю как это делается обычно. Меня интересует - как лучше. Ибо память можно выделять разными путями и из разных мест!
> Во втором - это как сумеет то самое приложение, что-нибудь
> типа
> SysAllocStringLen. В дельфи оно делается само.
Это если не выделять память напрямую, а делать просто pchar() и потом копировать в паскаль-строку?
Тогда возникают ещё вопросы:
- В какой момент этот пчар будет освобождаться?
- Если длл или программа не на дельфи - что будет?
← →
Reindeer Moss Eater © (2005-11-14 16:53) [7]Передавай всегда PChar.
Затем сразу делай копию там где принимаешь.
← →
Digitman © (2005-11-14 17:10) [8]
> Меня интересует - как лучше
единых критериев "лучшести" нет и быть не может, поскольку ты заранее не знаешь о соглашениях по менеджменту памяти в вызывающем модуле.
← →
Leonid Troyanovsky © (2005-11-14 17:22) [9]
> Razor (14.11.05 16:46) [6]
> Надо мне учится лучше мысли формулировать....
Золотые слова. Кста, к ним можно применить квантор всеобщности
(если мне не изменил склероз).
> > SysAllocStringLen. В дельфи оно делается само.
> Это если не выделять память напрямую, а делать просто pchar()
> и потом копировать в паскаль-строку?
> Тогда возникают ещё вопросы:
> - В какой момент этот пчар будет освобождаться?
> - Если длл или программа не на дельфи - что будет?
Не, не pchar. В крайнем случае BSTR. Т.е., то, что выделяет SysAllocString.
Освобождаться оно будет при SysFreeString (в вызывающем недельфийском
приложении). Или при SysReAllocString* в приложениии (or dll).
При манипуляциях в дельфийской dll могут быть как освобождения
(SysFree*), например, при выходе из диапазона видимости, так и
realloc, при увелечении длины строки.
Ну, а если все эти вещи представляются сомнительными, то лучший
путь - в требовании распределенного буфера (PChar, PWChar) + длина
буфера к хост-проиложению. В конце-концов, на этом Win32 простояла
не одну пятилетку.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.042 c