![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
поддержка плагинов в программе
Ruzzz © (2009-01-11 14:04:00)как предоставить возможность плагину изменять передаваемую ему строку? Все вроде просто но как быть с освобождением памяти?
Ну допустим толькл для чтения передать плагину PChar или пару (Pointer, Size) это не проблема, так как плагин ее не именяет то и освободидь строку сможет программа после того как плагин отработает.
А как быть с ситуацией когда плагин должен менять строку? Если плагин выделить некую память для измененной строки и передасть назад программе PChar, программа может сама освободить эту память? Не будет каких-либо утечек памяти?
И еще вопрос, если это будет не плагин а отдельный поток и таких много?
Заранее спасибо!
(2009-01-11 22:21:00) [1]Удалено модератором
Медвежонок Пятачок (2009-01-11 20:53:00) [2]либо вы мне мозги пудрите, скажите ведь не зря при создании DLL-проекта в delphi, в комментариях кое-какой текст написан? :)
Конечно не зря. А что? У меня где-то с этим коментарием есть противоречие?
Сергей М. (2009-01-11 20:10:00) [3]
> Ruzzz © (11.01.09 18:48) [17]
Не лучший вариант, но можно и так.
Вот тем, кстати, и привлекательна OLE/COM, что при ее использовании единый менедлер подразумевается
Ruzzz (2009-01-11 18:56:00) [4]Медвежонок Пятачок, я прошу прошения, вы помогаете мне, отвечаете в этой ветке, но либо я плохо изяснился, либо вы мне мозги пудрите, скажите ведь не зря при создании DLL-проекта в delphi, в комментариях кое-какой текст написан? :)
Ruzzz (2009-01-11 18:48:00) [5]менеджера памяти, правильно ли я понимаю что это? :)
- Использует стандартные функции ОС для выделения и освобождения (ну эт ясно)
- Для всех типов данных которые по сути являются динамическими массивами все выполняется прозрачно (в delphi это например string, array of ...)
- код менеджера реализован в библиотеке среды (в Delphi в system.pas)
Медвежонок Пятачок,
я знаю что Убивать string - забота менеджера памяти. но у меня не обязательно это будет строка, и второе, плагин может быть написан в другой среде, языке, да и мне кажется что в плагине будет реализован другой менеджер памяти, даже если они компилируются в одной среде.
Сергей М. по поводу
> > врядли будет иметь место
> Это почему же ?
правильно ли я делаю вывод? предоставить для плагина экспортируемую хостом функцию для выделения памяти, чтобы обеспечить работу одного экземпляра менеджера?
Медвежонок Пятачок (2009-01-11 18:16:00) [6]после того как плагин создаст буфер и вернет результат он уже не получит управление
А зачем ему что-то получать, если буфер в нем представлен типом string?
Убивать его - забота не твоя а менеджера памяти.
О чем я уже раз надцать сказал.
Ruzzz (2009-01-11 17:58:00) [7]Медвежонок Пятачок,
создаст плагин, это не вызывающия сторона, после того как плагин создаст буфер и вернет результат он уже не получит управление, покрайней мере этого хотелось бы
ладно всем спасибо, будем думать и искать
Медвежонок Пятачок (2009-01-11 17:17:00) [8]я ж говорю, передавать PChar в обе стороны.
На принимающей создавать копию.
Все.
И вызывающая чистит все, что насоздавала.
Ruzzz (2009-01-11 16:55:00) [9]KSergey, ограничивать размером нельзя, COM мне кажется излишним :(,
Медвежонок Пятачок
> Получил PChar из хоста.
> Сделал локальную копию string, все.
> Остальное уже не твоя забота.
я в этом и не видел проблемы, меня интересует такой момент: отработала функция плагина и возратила допустим строку хосту, что далее, уже в хосте, будет с памятью, которую выделил плагин?
DFT (2009-01-11 16:49:00) [10]
> KSergey © (11.01.09 15:46) [11]
полностью поддерживаю.
Решение более универсальное и изящное. В библиотеке создаем нужный нам класс реализующий определенный интерфейс. И при работе с интерфейсом имеем надежный контроль памяти благораря подсчету ссылок
KSergey (2009-01-11 15:46:00) [11]Если возможно - можно просто оговорить, что строка ограничена таким-то размером (выбрать разумное и достаточное число). Тоогда хост-приложение просто должно выделить соотв. буфер, в который плагин может накласть что угодно в пределах оговоренного буфера.
Плохо, что нельзя проконтроллировать это со стороны хост-приложения.
но есть же COM, там все это возможно, да и вообще проблемы с буферами и очисткой не возникнет, там все продумано.
Медвежонок Пятачок (2009-01-11 15:31:00) [12]А как быть с ситуацией когда плагин должен менять строку?
Ты еще скажи, что в плагине будешь это делать непосредственно с помощью функций для нултерминатейд строк.
/* если б то было правдой, то самого вопроса бы не было, так как квалификация не позволила бы задавать детские вопросы */
Сергей М. (2009-01-11 15:26:00) [13]
> врядли будет иметь место
Это почему же ?
Если ты разработчик хост-приложения, то для разработчиков плагинов к нему ты вправе публиковать соотв.требования.. И разработчики, если они хотят чтобы их плагины правильно взаимодействовали с твоим хост-приложениям, обязаны придерживаться этих требований.
Медвежонок Пятачок (2009-01-11 15:24:00) [14]не совсем понятно :( как же плагин сможет очистит память если я уже не планирую его тревожить после того как он отработал
Получил PChar из хоста.
Сделал локальную копию string, все.
Остальное уже не твоя забота.
Ega23 (2009-01-11 15:21:00) [15]
> Ну вот в этом то и проблема, что ситуация "один и тот же
> экз-р одного и того же менеджера памяти" врядли будет иметь
> место!
procedure Foo(var Data; var DataSize : Integer);
Ruzzz (2009-01-11 15:19:00) [16]Сергей М.
Ну вот в этом то и проблема, что ситуация "один и тот же экз-р одного и того же менеджера памяти" врядли будет иметь место! :(
Как быть в таком случае?
Ega23 (2009-01-11 15:15:00) [17]
procedure ChangeString( varaStr : PANSIChar);?
Сергей М. (2009-01-11 15:13:00) [18]
> программа может сама освободить эту память? Не будет каких-
> либо утечек памяти?
Если хост-приложение и плагин используют один и тот же экз-р одного и того же менеджера памяти, то никаких проблем в этом нет.
Ruzzz (2009-01-11 15:05:00) [19]плагин это по сути ддл с функцией на экспорт, которую вызывает основная программа, по сути получается что эта функция должна возвращать измененную строку, как бы это сделать более изящно?
> копия строки в плагине и каждый сам чистит что насоздавал.
не совсем понятно :( как же плагин сможет очистит память если я уже не планирую его тревожить после того как он отработал
> экспортируй функцию из плагина, которая будет освобождать
> память
а может есть какое "красивое" решение?
Медвежонок Пятачок (2009-01-11 14:21:00) [20]копия строки в плагине и каждый сам чистит что насоздавал.